2017-02-15 59 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。 –