【问题标题】:Google Closure Compiler is importing my extern functionsGoogle Closure Compiler 正在导入我的外部函数
【发布时间】: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 相同的模式,但它也没有帮助。

标签: google-closure-compiler


【解决方案1】:

事实证明,当您指定外部文件时,您必须在每个外部文件前面使用 --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 的编译器,但无论如何都会继续并将其函数复制到已编译的代码中。这不应该被允许并且应该发出警告。这花了一整天的时间来追查。

【讨论】:

  • 任何没有前面标志的路径都被假定为 JS 输入文件。这种风格在许多 CLI 工具中是相当标准的。
猜你喜欢
  • 2015-10-25
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多