Я знаю, что вы не можете условно require
модуль с браузером, потому что они связаны во время компиляции, а не время выполнения. Как насчет условно снятия модулей?Условный компиляция/необходимость использования браузера (удаление мертвого кода)
Предположим, у меня есть приложение, которое позволяет создавать галереи изображений. Галереи также можно редактировать (переупорядочение изображений и т. Д.). Но рендеринг галереи и редактирование связаны и не могут быть полностью разделены. Но для развертывания галерей мне не нужны функции редактирования, и я знаю, какие модули используются. Я хочу создать два разных пакета: один с возможностью редактирования и один без исключения, исключив большую часть кода редактирования. То, что я сделал, это использование envify
и устранение мертвого кода uglify, чтобы исключить мой собственный код из меньшего пакета.
До (thing.js)
//...some code that only the editor needs...
module.exports = thing;
После (thing.js)
if(process.env.INCLUDE_EDITOR === 'yes') {
//...some code that only the editor needs...
module.exports = thing;
}
Это прекрасно работает и редактор расслоением уже меньше. И так как я знаю, что в другом комплекте никогда не будет использоваться функциональность thing
, все в порядке, просто ничего не экспортировать и иметь пустой модуль.
Теперь вот в чем проблема. Если thing.js
требует модуль, скажем pica
, он по-прежнему будет в комплекте , хотя никто не использует его после устранения мертвого кода.
До (thing.js)
var pica = require('pica');
//...some code that uses pica...
module.exports = thing;
После (thing.js)
if(process.env.INCLUDE_EDITOR === 'yes') {
var pica = require('pica');
//...some code that uses pica...
module.exports = thing;
}
Подводя итог: мой пакет теперь содержит pica
библиотеку, но никто не требует. Код, который ему нужен, был мертвым кодом, но, возможно, угляд не может понять, что он может полностью удалить pica
.
Возможно, вам будет полезна ['factor-bundle'] (https://github.com/substack/factor-bundle)? – casr
@casr спасибо! Я не думаю, что это можно применить здесь. Учитывая пример в документах, я хочу удалить w и z из пакета x, потому что я знаю, что 'console.log (z (5) * w (2));' никогда не будет выполнен. Тем не менее, это все равно будет в комплекте. Я как бы делаю глупые сумасшедшие вещи здесь. Но эй, я удалил 20% из не-редактора! – Prinzhorn