【发布时间】:2017-08-05 06:09:13
【问题描述】:
我在 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 () {
}
};
【问题讨论】:
-
你不导出外部。那是没有意义的。
-
我没有导出外部。我什至省略了代码行 window["MyCustomResizer"] = MyCustomResizer;但这什么也没做。忽略它只会导致从我的代码中删除函数调用。现在这毫无意义。我也遵循了与使用 jQuery 相同的模式,但它也没有帮助。