0

私は、グーグルクロージャーコンパイラを使用して書いているライブラリから可能な限りすべてのバイトを搾り出す過程にあります。

ライブラリは2つのファイルで構成されています。

クロージャービルダーを使用してADVANCED_OPTIMIZATIONSでコンパイルしています。使用するオプションは、このgruntconfigの「compile」キーにあります。

コンパイルされたファイルを読むと、いくつかのシンボルが正しくコンパイルされていないことがわかります。私はこの事実を利用して、1つのメソッドのエクスポートを省略し、エクスポートされました(addListener)。removeListenerのように、他のメソッドは、エクスポートした場合にのみ「アンコンパイル」されます。

したがって、シンボルがエクスポートされるコンパイル済みコードは次のようになります。

var k = e;
k.C = g;
var l = g.prototype;
l.addCheck = l.j;
l.check = l.k;
l.addCheckListener = l.r;
l.removeCheckListener = l.s;
l.removeListener = l.removeListener; // why is that?
// taking advantage of addListener not being compressed, i omitted it, so saved
// a few more bytes:
// l.addListener = l.addListener; <----
l.isDone = l.o;
l.isDoneCheck = l.p;
k.C.prototype = l;
window.ss = {
    ready: k
};

なぜそれが起こっているのですか?結果のコードサイズをさらに最適化するために何ができますか?

ボーナスの質問として、コンパイルされたコードでsetTimeoutdeleteの使用を減らすために、2つのプライベートメソッドを作成しました。ただし、コンパイラは、これらのメソッドに対して行ったすべての呼び出しをインライン化することを選択したため、コンパイルされたソースで非圧縮のdeleteおよびsetTimeout呼び出しが複数回発生しました。

例えば

function rem(obj, key) { delete obj[key]; }
function doStuff() { 
    var anObject = {key:1};
    rem(anObject, 'key'); // 'key' isn't really a string literal in the code
}

これは次のようにコンパイルされます。

function a(){var b={z:1}; delete b.z}

それを回避するためのヒントもありますか?

乾杯

4

1 に答える 1

1

タイプベースのプロパティの名前変更に関するクロージャーコンパイラのwikiページを最初に確認します(https://code.google.com/p/closure-compiler/wiki/ExperimentalTypeBasedPropertyRenaming)。文字列のインライン化に関するコンパイラのFAQ(https://code.google.com/p/closure-compiler/wiki/FAQ#Closure_Compiler_inlined_all_my_strings,_which_made_my_code_size)をもう一度見て、質問に答えてください:pre-gzipサイズのみを気にしますか。

于 2012-07-04T02:14:14.147 に答える