6

Google Closure Compiler は、コード内のすべての「true」、「false」、および「null」の名前を次のように変更します。

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

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

if (someVariable == s)

今; Google アナリティクス コードは独自の「s」変数を定義します。値「true」をオーバーライドします。ご覧のとおり、これは多くの問題を引き起こします。

GA コードを変更したくありません。Closure Compiler に true などの名前変更をやめてもらいたいだけです。Externs は機能しません。

これを達成する方法を知っていますか?

4

3 に答える 3

11

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

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

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

于 2011-01-06T19:49:15.353 に答える
1

aliasKeywordsCompilerOptionsというオプションがあります。に設定すると、コンパイラは「true」、「false」、および「null」をエイリアスしません。false

于 2014-04-22T16:42:21.240 に答える
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オブジェクトに追加するだけです。

コードを変更すると、変数に別の名前が付けられる可能性があります。また、ページにグローバル変数が突然増えた場合はどうなりますか? これらの問題はすべて、コードを常に上記のようなラッパーに入れる正当な理由です。

于 2011-01-06T19:10:17.303 に答える