2017-02-15 4 views
2

Я составил этот пример javascript код с Google Closure CompilerGoogle Closure Compiler ADVANCED режим паузы код

$(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) 

Примечание: Я использую последнюю версию Closure Compiler

+0

Не весь код безопасен для 'режиме ADVANCED' компиляции. См. Http://closuretools.blogspot.com/2012/09/which-compilation-level-is-right-for-me.html –

ответ

0

Рассмотрите возможность использования --process_jquery_primitives. От the docs:

JQuery использует соглашения, которые Closure Compiler изначально не понять. Чтобы создать действующий код, удалите предупреждения, а включите оптимизацию, Closure Compiler расширяет известные методы jQuery и псевдонимы аналогично тому, как макросы расширяются на других языках .

+1

Я получил эту ошибку, когда я использую этот аргумент в командной строке. –

2

Причина выхода изменилась потому, что с уровнем компиляции установлен ADVANCED_OPTIMIZATIONS, то Closure Compiler переименует все функции и переменные в простейшей форме.

Есть функции и имена переменных оно сконфигурировано, чтобы избежать переименования как console.log и имена свойств, как height, width и т.д. По умолчанию он не понимает, что функции JQuery не должен быть переименован, так что, когда речь идет через них они будет изменено.

Там два способа обойти это:

  1. Создать JQuery экстернов файл и передать его в компиляторе. Файл externs - это файл, содержащий определения функций и переменных, которые помогают компилятору признать, что он не должен переименовывать что-либо, соответствующее предоставленному определению.
  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 externs являются частью проекта компилятора (и распространяются через npm). См. Https://github.com/google/closure-compiler/tree/master/contrib/externs. –

Смежные вопросы