我在javascript文件中创建了一个extern,并将其指定为Google Closure Compiler(GCC)命令行选项的一部分。我正在使用高级模式进行编译。 GCC正在我的extern中使用该函数并将其放入已编译的代码中。我不知道为什么会这样做。 GCC假设认识到extern函数在一个单独的文件中。当我导出对象时,它将重命名对象并保留对象的函数名称,但它将在编译的代码中创建整个extern函数的副本。
我尝试了很多变化(这里列出的数量太多),看看如何防止GCC这样做,但没有任何效果。
我的外界:
var MyCustomResizer = {
"onResize": function (a, b) {
},
"detach": function () {
}
}
我按如下方式导出了对象:
window["MyCustomResizer"] = MyCustomResizer;
我的应用使用"分离"功能:
MyCustomResizer.detach();
我的编译器设置:
java -jar closure-compiler/compiler.jar \
--compilation_level ADVANCED_OPTIMIZATIONS \
--externs scripts/externs/resizer-extern.js \
--js_output_file scripts/release/myapp.js \
--warning_level VERBOSE \
--language_out ECMASCRIPT5 \
--language_in=ECMASCRIPT_2017 \
--js scripts/base.js
生成的编译输出包含:
ha.detach();
...
var ha = {
onResize: function () {
}, detach: function () {
}
};
答案 0 :(得分:0)
事实证明,当你指定extern文件时,你必须在每个extern文件前面使用--extern选项。我只把它放在第一个:
不正确:
java -jar closure-compiler/compiler.jar \
--compilation_level ADVANCED_OPTIMIZATIONS \
--externs scripts/externs/jQuery/jquery-1.9-externs.js \
scripts/externs/third-party.js \
--js_output_file scripts/release/servetus-min.js \
正确:
java -jar closure-compiler/compiler.jar \
--compilation_level ADVANCED_OPTIMIZATIONS \
--externs scripts/externs/jQuery/jquery-1.9-externs.js \
--externs scripts/externs/third-party.js \
--js_output_file scripts/release/servetus-min.js \
我觉得奇怪的是,编译器只是忽略没有--externs的那个,但只是继续前进并将其函数复制到编译代码中。不应允许这样做,并应发出警告。这需要一整天的时间来追踪。