我使用 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)
注意:我正在使用最新的闭包编译器
答案 0 :(得分:2)
输出更改的原因是因为编译级别设置为ADVANCED_OPTIMIZATIONS
,Closure Compiler会将所有函数和变量重命名为最简单的形式。
它配置了函数和变量名,以避免重命名console.log
和属性名称,如height
,width
等。默认情况下,它不理解jQuery函数不应该'重新命名,所以遇到它们时它们会被改变。
有两种解决方法:
使用您的代码
$(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方法 和别名的方式类似于宏在其他方面的扩展方式 语言。