0

この他の SO スレッドからのアドバイスに従ってconsole.log()コードからステートメントを削除しました。

残念ながら、現在、Closure コンパイラはconsole.log()ステートメントだけでなくコード全体を削除しています。

誰かがこれを説明できますか?私は途方に暮れています...

JS ファイル 1

(function(){
/** @const */
LOG = false;

function log() {
    return console.log.apply(console, arguments);
}

LOG && log('hello world !');

var foo='bar';
LOG && log("foo"+foo);
})();

JS ファイル 2

(function(){
/** @const */
LOG = false;    

function test(){
    alert('testing...');
}

var baz='bazzy';
LOG && log("baz"+baz);


})();

閉鎖コンパイラのステップ:

$ java -jar compiler-latest/compiler.jar --js j1.js j2.js --js_output_file compiled.js 

結果:

(function(){LOG=!1})();(function(){LOG=!1})();
4

1 に答える 1

2

コンパイラは、コードの残りの部分に到達できないと判断するためです。

両方のファイルの定数 LOG が false に設定されており、何もエクスポートしていません (goog.export* または window['...'] = ...)。実行される可能性のあるコードの前には LOG && があり、これは実行されないことを意味します。

そのため、何も実行できないため、コンパイラはすべてを削除します。

機能テストが削除される理由: 誰もそれを呼び出しません。単純です。ファイルの 1 つでそれを呼び出すと、コンパイラはそれを削除しません。


LOG を定義して 1 つのファイルにのみ記録できます (実際にはそうすべきです)。これを機能させるには、すべてのファイルでコードの周りの無名関数呼び出しを削除します。コマンドライン オプションを使用して、コンパイル済みコードに追加するようにコンパイラに指示できます。

--output_wrapper=(function(){ %output% })();

したがって、2 つのファイルは次のようになります。

JS ファイル 1

/** @const */
var LOG = false;

function log() {
    return console.log.apply(console, arguments);
}

LOG && log('hello world !');

var foo='bar';
LOG && log("foo"+foo);

JS ファイル 2

function test(){
    alert('testing...');
}

var baz='bazzy';
LOG && log("baz"+baz);

// call test, so it a) isnt stripped and b) well, executed :)
test();

また、グローバル変数と関数を「名前空間」に入れて、グローバル スコープを汚染しないようにすることもできます。

// create namespace (which is just a normal object)
var MyNamespace = {};

// create a namespaced function
MyNamespace.test = function() {
    alert('test');
}

// call it
MyNamespace.test();
于 2013-09-17T21:36:55.907 に答える