Google Closure Compiler正在导入我的extern函数

时间:2017-08-05 06:09:13

标签: google-closure-compiler

我在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 () {
    }
};

1 个答案:

答案 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的那个,但只是继续前进并将其函数复制到编译代码中。不应允许这样做,并应发出警告。这需要一整天的时间来追踪。