2011-01-06 2 views
6

Компилятор Google Closure переименовывает все «истинные», «ложные» и «нулевые» вхождения в коде типа;Как предотвратить компилятор Closure от переименования «true», «false» и «null»

var s = true, x = null, V = false; 

и вместо этого использует эти стенограммы; в таких условиях, как;

if (someVariable == s) 

сейчас; Код Google Analytics определяет собственную переменную s; переопределение значения «true»; и, как вы видите, это вызывает множество проблем.

Я не хочу менять код GA; Я просто хочу, чтобы Closure Compiler прекратил переименование и т. Д. Внешние службы не работают.

Знаете ли вы, как это сделать?

+0

Можете ли вы предоставить свои собственные константы, например '_true_ = true', а затем заменить их перед запуском, используя Closure Compiler? –

ответ

11

Оказалось, что можно запретить компилятору Google Closure распечатывать глобальные определения (функцию и/или переменную) с помощью параметра, называемого «output_wrapper», в код командной строки, например;

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})();" --js input.js --js_output_file output.js 

Таким образом, он не вступает в противоречие с глобальными переменными и печатает весь ваш код в анонимную функцию обертку.

+0

Я бы посоветовал использовать этот метод для добавления анонимной функции в ваш предварительно обфускационный код. Это связано с тем, что компилятор Closure помещает истинные, ложные и нулевые значения в глобальное пространство имен, что может вызвать конфликты с другими JS – eggsy84

1

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

Чтобы исправить это, поместите его внутри анонимной функции обертки:

(function() { 
    // a self contained "namespace" 
    var s = true; // won't be affected by the analytics code anymore  


    // expose something 
    window.foo = function() {}; 

})(); // execute the function immediately 

Это общей идиома для предотвращения столкновений имен переменных и т.д. Если вам нужно сделать вещи доступны за пределы wrapper, просто добавьте их как свойства в объект window.

Не заморачивайся с закрытием, когда вы меняете свой код, это может привести к тому, что переменные будут иметь разные имена. Также, когда на вашей странице появляются все более глобальные переменные? Все эти проблемы являются вескими основаниями всегда помещать ваш код в оболочку, как указано выше.

+0

На самом деле, я ничего не переименовываю. У меня есть несколько файлов, которые запускаются через CC (компилятор закрытия) за один проход; и все коды в каждом отдельном файле имеют собственное пространство имен с анонимной оболочкой функции, как в вашем примере. Это просто, CC «странно» переименовывает «true», «false» и «null» в глобальное пространство имен. И я не могу изменить способ действия CC. – dashersw

1

Существует опция в CompilerOptions под названием aliasKeywords. Когда установлено значение false, компилятор не будет псевдоним «true», «false» и «null».

+0

Это то, что я искал. Для будущих посетителей, к счастью, эта контрпродуктивная функция была удалена в 2015 году [\ [1 \]] (https://github.com/google/closure-compiler/commit/813293c2bdf2fc230cac9371af92c5def4fb4514) [\ [2 \]] (https: //github.com/google/closure-compiler/commit/dd84f24179bb433d27176e555efa3b87782ae346) (сжатие повторяющихся символов - это то, что для GZIP). –

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