【问题标题】:Closure compiler not compiling all symbols闭包编译器未编译所有符号
【发布时间】:2012-07-03 21:45:57
【问题描述】:

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

该库由两个文件组成:

我正在使用闭包构建器使用 ADVANCED_OPTIMIZATIONS 进行编译,我使用的选项位于此 grunt config 的“编译”键中。

阅读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
};

为什么会发生这种情况,我可以做些什么来进一步优化生成的代码大小?

作为一个额外的问题,我创建了两个私有方法来减少编译代码中 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}

还有避免这种情况的提示吗?

干杯

【问题讨论】:

    标签: google-closure-compiler


    【解决方案1】:

    首先查看闭包编译器 wiki 页面,了解基于类型的属性重命名 (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 大小。

    【讨论】:

    • 嘿@john,谢谢你的回复。我在闭包编译器 wiki 上 searched 进行基于类型的优化,但找不到任何相关内容......你有什么想法?
    • 用链接更新了我的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多