Closure编译器不编译所有符号

时间:2012-07-03 21:45:57

标签: google-closure-compiler

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

该库由两个文件组成:

我正在使用闭包构建器使用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}

关于避免这种情况的任何提示?

干杯

1 个答案:

答案 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大小。