2017-02-15 63 views
2

我编这个例子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) 

注:我使用的是最新的封编译

+0

并非所有的代码是'ADVANCED'模式编译安全。请参阅http://closuretools.blogspot.com/2012/09/which-compilation-level-is-right-for-me.html –

回答

0

考虑使用--process_jquery_primitives。 From the docs

jQuery使用约定,Closure编译器本身不会原生地理解 。为了生成功能正常的代码,删除警告并启用优化,Closure Compiler以类似的方式扩展已知的jQuery方法 和别名,这与宏在其他 语言中的扩展方式类似。

+1

当我在命令行上使用该参数时出现此错误。 –

2

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

有它配置为避免重命名像console.log和财产的名称,如heightwidth等默认情况下,它不明白,jQuery函数不应该被重新命名函数和变量名,所以当它遇到他们,他们将会改变。

有没有解决这个越来越两种方式:

  1. 创建一个jQuery实习医生文件,并将其传递给编译器。 extern 文件是一个包含函数和变量定义的文件,可帮助编译器识别它不应重命名与提供的定义相匹配的任何内容。
  2. 使用方括号表示法而不是点表示法来访问jQuery函数和变量。使用这种方法,方括号将被转换成点符号,但不需要重命名该变量。

使用你的代码

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

将被编译到

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

为了扩展这个例子,当你有一个对象具有属性,你不想改变,使用引号当你声明对象时,例如:

而不是

var foo = {bar:'bar'}; 

使用

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

希望这将有助于:)

+2

维护良好的jQuery extern是编译器项目的一部分(通过npm分发)。请参阅https://github.com/google/closure-compiler/tree/master/contrib/externs。 –