我正在使用谷歌闭包编译器从我正在编写的库中挤出每个字节。
该库由两个文件组成:
我正在使用闭包构建器使用ADVANCED_OPTIMIZATIONS进行编译,我使用的选项位于此grunt config的'compile'键中。
阅读compiled file我可以看到一些符号没有像他们应该那样被编译。我甚至利用了这个事实,省略了导出一个方法,并导出了它( 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 和删除。但是,编译器选择内联对这些方法进行的所有调用,导致在编译源中多次调用未压缩的删除和 setTimeout 。
e.g。
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}
关于避免这种情况的任何提示?
干杯
答案 0 :(得分:1)
首次查看基于类型的属性重命名(https://code.google.com/p/closure-compiler/wiki/ExperimentalTypeBasedPropertyRenaming)的闭包编译器wiki页面。关于字符串内联(https://code.google.com/p/closure-compiler/wiki/FAQ#Closure_Compiler_inlined_all_my_strings,_which_made_my_code_size)的第二次查看编译器常见问题并回答问题:你是否只关心pre-gzip大小。