7

クロージャコンパイラは関数をインライン化しますが、その関数がインライン化されていない場合、コードサイズは小さくなります(私はコードサイズのみを気にします-これはJS1k用です)。その関数をインライン化したくないことをコンパイラーに伝えることはできますか?

編集:もう少し説明するために、ここに私の関数があります:

function lineTo(x,y) {
  a.lineTo(x,y);
}

aキャンバスコンテキストのどこ。コードには非常に多くa.lineToのが含まれているため、この関数を使用する価値があります。このように、私のコードは1019バイトです(そしてすべてのlineTosはに置き換えられa.lineToます)。関数を次のように変更した場合:

function lineTo(x,y) {
  a.lineTo(x,y);
  console.log();
}

新しい行はどういうわけかコンパイラにこの関数をインライン化しないように強制します。これにより993バイトが得られます。したがって、私が取り除くことができれば、console.log();さらに14バイト節約できます。

4

2 に答える 2

4

チュートリアルから:

... ClosureCompilerが保持したい関数を削除していることに気付いた場合、これを防ぐには2つの方法があります。
*関数呼び出しをClosureCompilerによって処理されるコードに移動します。
*保持したいシンボルをエクスポートします。

ここで説明する2つ目が必要になる可能性がありますが、基本的には、windowプロパティとして明示的に設定することになります。

function foo() {
}
window['foo'] = foo;

JS1kの提出では、最後の行は不要なので、そのままにしておきます。Closureは引き続き関数の名前を変更しますが、シンボルの名前aを名前で変更し始め、そこから継続するため、名前が全体的に長くなる可能性は低いことに注意してください。

オンラインコンパイラサービスで試すことができます。これを貼り付けると:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==

// ADD YOUR CODE HERE
function hello(name) {
  alert('Hello, ' + name);
}
hello('New user');

...コンパイルされた結果は

alert("Hello, New user");

しかし、あなたが追加した場合

window['hello'] = hello;

...最後に、コンパイルされた結果は次のとおりです。

function a(b){alert("Hello, "+b)}a("New user");window.hello=a;
于 2010-11-28T16:24:03.460 に答える