2011-01-06 2 views
6

Google Closure Compilerは、コード内のすべての "true"、 "false"、 "null"Closure Compilerが "true"、 "false"、 "null"の名前を変更しないようにする方法

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

これらの省略形を代わりに使用します。のような条件で;

if (someVariable == s) 

now; Googleアナリティクスのコードでは、独自の「s」変数が定義されています。値 "true"をオーバーライドします。あなたが見ることができるように、これは多くの問題を引き起こします。

私はGAコードを変更したくありません。私はちょうどClosure Compilerがtrueなどの名前を変更するのをやめるようにしたい。Externsは動作しない。

これを達成する方法はありますか?

+0

独自の定数、たとえば '_true_ = true'を指定してから、Closure Compilerを実行する前にこれらの変数に置き換えることはできますか? –

答えて

11

Googleクローズコンパイラが "output_wrapper"というパラメータでグローバル定義(関数や変数)を次のようなコマンドラインコードに出力しないようにすることができます。

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

このように、グローバル変数と衝突せず、すべてのコードを匿名関数ラッパーに出力します。

+0

私はこのメソッドを使用して、あらかじめ難読化されたコードで匿名関数を追加することをお勧めします。これは、Closureコンパイラがグローバル名前空間にtrue、false、nullの値を入れて、他の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 

ラッパーを追加するには、単にオブジェクトとしてwindowオブジェクトにプロパティとして追加します。

あなたのコードを変更すると、変数に異なる名前を与える可能性があります。また、あなたのページに突然グローバル変数が突然入ってしまったらどうしますか?これらの問題はすべて、上記のようなラッパーにコードを置く良い理由です。

+0

実際、私は名前を変更しません。私は、CC(クロージャコンパイラ)を一度に実行するいくつかのファイルを持っています。あなたの例のように、別々のファイルのすべてのコードには、匿名関数ラッパーを使用した独自の名前空間があります。 CCはグローバルな名前空間で "妙に" "true"、 "false"、 "null"の名前を変更します。そして、私はCCが動作する方法を変更することはできません。 – dashersw

1

CompilerOptionsには、aliasKeywordsというオプションがあります。 falseに設定すると、コンパイラは 'true'、 'false'、 'null'のエイリアスになりません。

+0

これは私が探していたものです。今後の訪問者には、幸いなことに、この非生産的機能は2015年に\ https://github.com/google/closure-compiler/commit/813293c2bdf2fc230cac9371af92c5def4fb4514 [\ [2 \]](https: //github.com/google/closure-compiler/commit/dd84f24179bb433d27176e555efa3b87782ae346)(重複するシンボルを圧縮するのは、GZIPのためのものです)。 –

関連する問題