我知道您不能有条件require
地使用 browserify 模块,因为它们是在编译时捆绑的,而不是在运行时捆绑的。有条件地剥离模块怎么样?
假设我有一个应用程序可以让您创建图片库。还可以编辑画廊(重新排序图像等)。但是画廊的渲染和剪辑是耦合的,不能完全分开。但是对于部署画廊,我不需要编辑功能,而且我知道使用了哪些模块。我想创建两个不同的包,一个具有编辑功能,一个不消除大部分编辑代码。我所做的是使用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
库,但没有人需要它。需要它的代码是死代码,但uglify显然无法理解它可以pica
完全删除。