Google闭包编译器ADVANCED模式会破坏代码

时间:2017-02-15 07:27:26

标签: javascript jquery google-closure-compiler

我使用 Google Closure Compiler 编译了此示例javascript代码

$(document).on('click', function () {
   console.log('Hello');
});

而且,我得到了这个输出。

$(document).a("click",function(){console.log("Hello")});

此处on已替换为a。所以,当我在浏览器上运行它时出错了。

我使用此命令行编译脚本。

java -jar closure-compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js script.js

当我使用--process_jquery_primitives参数时,我收到了此错误。

java.lang.RuntimeException: com.google.javascript.jscomp.CompilerOptionsPreprocessor$InvalidOptionsException: The jQuery pass and the Closure pass cannot both be enabled.
        at com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread(CompilerExecutor.java:126)
        at com.google.javascript.jscomp.Compiler.runInCompilerThread(Compiler.java:740)
        at com.google.javascript.jscomp.Compiler.compile(Compiler.java:710)
        at com.google.javascript.jscomp.Compiler.compile(Compiler.java:680)
        at com.google.javascript.jscomp.AbstractCommandLineRunner.doRun(AbstractCommandLineRunner.java:1080)
        at com.google.javascript.jscomp.AbstractCommandLineRunner.run(AbstractCommandLineRunner.java:492)
        at com.google.javascript.jscomp.CommandLineRunner.main(CommandLineRunner.java:1866)
Caused by: com.google.javascript.jscomp.CompilerOptionsPreprocessor$InvalidOptionsException: The jQuery pass and the Closure pass cannot both be enabled.
        at com.google.javascript.jscomp.CompilerOptionsPreprocessor.preprocess(CompilerOptionsPreprocessor.java:74)
        at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:746)
        at com.google.javascript.jscomp.Compiler.access$000(Compiler.java:84)
        at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:713)
        at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:710)
        at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:91)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

注意:我正在使用最新的闭包编译器

2 个答案:

答案 0 :(得分:2)

输出更改的原因是因为编译级别设置为ADVANCED_OPTIMIZATIONS,Closure Compiler会将所有函数和变量重命名为最简单的形式。

它配置了函数和变量名,以避免重命名console.log和属性名称,如heightwidth等。默认情况下,它不理解jQuery函数不应该'重新命名,所以遇到它们时它们会被改变。

有两种解决方法:

  1. 创建一个jQuery externs文件并将其传递给编译器。一个外部 file是一个包含函数和变量定义的文件,可帮助编译器识别它不应重命名与提供的定义匹配的任何内容。
  2. 使用方括号表示法而不是点符号来访问jQuery函数和变量。使用此方法,方括号将转换为点表示法,但不重命名变量。
  3. 使用您的代码

    $(document)['on']('click', function () {
       console.log('Hello');
    });
    

    将编译为

    $(document).on("click",function(){console.log("Hello")});
    

    要扩展此示例,当您拥有一个不希望更改属性的对象时,请在声明对象时使用它们周围的引号,例如

    而不是

    var foo = {bar:'bar'};
    

    使用

    var foo = {'bar':'bar'};
    

    希望这会有所帮助:)

答案 1 :(得分:0)

考虑使用--process_jquery_primitives。来自the docs

  

jQuery使用Closure Compiler本身不具备的约定   了解。为了生成正常运行的代码,请删除警告和   启用优化,Closure Compiler扩展了已知的jQuery方法   和别名的方式类似于宏在其他方面的扩展方式   语言。