私は、グーグルクロージャーコンパイラを使用して書いているライブラリから可能な限りすべてのバイトを搾り出す過程にあります。
ライブラリは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
};
なぜそれが起こっているのですか?結果のコードサイズをさらに最適化するために何ができますか?
ボーナスの質問として、コンパイルされたコードでsetTimeoutとdeleteの使用を減らすために、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}
それを回避するためのヒントもありますか?
乾杯