如何在使用库时利用闭包编译器?

时间:2011-11-11 18:52:46

标签: javascript design-patterns google-closure-compiler

我最近一直在使用谷歌的一个很棒的工具,它可以进行一些代码优化和部分执行,例如它需要像:

//Just an alias for an elementByID selector
function $(bar){
    return document.getElementById(bar);
}

//Call the selector
alert($("foo").value);

并将其缩短为alert(document.getElementById("foo").value);,从优化角度来看这非常棒。

我只是在解释这个,因为我认为这个概念适用于像jQuery这样的大型库,它基本上试图抽象出JavaScript所做的一些事情,比如通过ID选择。

在快速测试中,我将整个jQuery生成文件加载到编译器并在其末尾添加了一些文本:alert($("#foo").val());

可悲的是,编译器无法通过我上面的简单示例来映射jQuery的设计和结果,而是我的输出大约是85kb的文本,alert($("#foo").K());卡在最后。基本上,我只是缩小了代码,并没有利用上面演示的很棒的功能。

所以我的问题是,如果我最终使用库,我怎么能以这样的方式编写代码,即闭包编译器能够将我的代码简化为原生JS(或者比85kb的未使用代码更有效)?或者,如果他们想要制作一个很好的小型图书馆,那么有人应该采取什么样的设计呢?

2 个答案:

答案 0 :(得分:2)

AFAIK,jQuery尚未编写为由Closure Compiler的高级模式优化。它有一个“externs”文件,它可以使其公共属性和类不被重命名,但它不会像你发现的那样启用大多数优化(例如死代码删除)。这是非常可惜的,因为jQuery对象(如果属性编写)确实非常适合Closure Compiler的原型虚拟化功能。

稍微偏离主题

如果你不依赖于jQuery,你可以考虑Dojo Toolkit,可以被修改为与Closure Compiler一起使用,同时支持大多数优化(尤其是死机) - 代码删除)。

有关详细信息,请参阅this document

答案 1 :(得分:1)

jQuery需要特别努力来缩小自身,并且在此过程中使自己对Closure Compiler不敏感。

Closure Library是为了充分利用Closure Compiler而编写的库的一个例子。

通常,编译器在原型继承和简单结构方面表现最佳:

/ ** @constructor * / function Class(){} Class.prototype.f = function(){};

使用显式导出的界面: window ['MyLib'] = {'method',method};

通常,如果库具有相对于内部代码量较小的外部接口,则高级模式仅对库有意义。但是,我绝对鼓励编写您的库,以便它可以被高级模式编译项目使用(这需要分离出用作独立库时使用的导出,如果它们使用高级模式缩小库本身)