阻止编译器将代码从一个块移到另一个块?

时间:2018-07-06 13:58:10

标签: google-closure-compiler

我在this上阅读了以下声明:

“请记住,如果编译器确定只将代码从该块中使用,则可以并且确实将代码从一个块移动到其他块输出文件中。”

有什么办法将其关闭?

我有一个“主”块和一个“可选”块,我发现可选块中的代码被完全移入了主块。 我的可选代码只会从主代码中调用,只有在确定我们确实要加载可选内容时(基于两者的外部标志),

在不需要可选内容的情况下,我想使主代码的大小最小化,但就我所见,闭包似乎是不可能的。

编辑: 为了拆分代码,我在(java)命令行上使用-chunk选项。我将“主要”文件夹指向几个文件夹(“ src / Infra / *。js”等),并将“ auto”用于块的numFiles。我将“可选”指向三个特定文件(无通配符),并将3指定为numFiles。 要加载“可选”脚本,“ main”将脚本标记写入页面,并在加载时有Promise解析。 “可选”应该实例化它定义的类,并将对该实例的引用推送到全局名称空间中的数组,然后main从数组中读取引用,并对其调用init()方法,并传入一些依赖项。 有更好的支持(并且同样紧凑)的方法吗?

EDIT2:如果有人遇到类似的问题,我使用uglifyjs的“ nameCache”功能解决了该问题,因此不必同时编译单独的组件。

1 个答案:

答案 0 :(得分:1)

编译器不会将代码“向上”移动到模块图中。发生的事情是编译器以某种方式认为直接需要在可选块中定义的符号。

这种情况最经常发生是因为您正在使用依赖关系管理和模块。当编译器对依赖项进行排序时,对于CommonJS,如果通过require直接导入任何“可选”文件,对于ES6,则通过import导入;对于闭包,则通过goog.require导入。在这种情况下,编译器会将它们添加到主模块中。

更具体地说,我实际上必须查看代码。