0

我正在使用谷歌闭包编译器从我正在编写的库中挤出每个可能的字节。

该库由两个文件组成:

我正在使用闭包构建器使用 ADVANCED_OPTIMIZATIONS 进行编译,我使用的选项在这个grunt config的 'compile' 键中。

阅读编译后的文件,我可以看到一些符号没有按应有的方式编译。我什至利用了这一事实并省略了导出一个方法,它被导出了(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的使用。然而,编译器选择内联我对这些方法所做的所有调用,导致在编译的源代码中多次调用未压缩的deletesetTimeout 。

例如

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

首先查看基于类型的属性重命名的闭包编译器维基页面(https://code.google.com/p/closure-compiler/wiki/ExperimentalTypeBasedPropertyRenaming)。第二次查看关于字符串内联的编译器常见问题解答(https://code.google.com/p/closure-compiler/wiki/FAQ#Closure_Compiler_inlined_all_my_strings,_which_made_my_code_size)并回答问题:你只关心预 gzip 大小.

于 2012-07-04T02:14:14.147 回答