我应该使用YUI压缩器还是新的Google Closure编译器来压缩我的JavaScript?

53

YUI Compressor被公认为最好的代码最小化工具,但Closure似乎更好。


8
谢谢告诉我关于Google Closure,我以前从未听说过 :) (+1表示点赞或支持) - Kaze no Koe
2
我还要补充一点,这里有一个鲜为人知的打包工具:http://dean.edwards.name/packer。据我所知,这是效果最好的打包工具,但你需要添加所有隐式分号,可以使用JSlint来实现。 - Kaze no Koe
3
Packer 已经不太受欢迎了,因为它需要在每次运行时解包。 - Nosredna
2
我想顶一下这个问题,看看自从第一次提出这个问题以来有没有什么变化。 - J V
这很大程度上取决于你的编码风格,但在我的情况下,Packer 几乎总是比 YUI 压缩器创建更大的文件。我最近只在一个项目中开始使用 Google Closure Compiler,对于那个项目,它给了我比 YUI 压缩器稍微小一点的结果。 - John Slegers
我经常使用闭包,它总能为我节省一些额外的字节。 - user2509223
7个回答

29

"Whichever you find best for you"这个答案目前普遍适用 - YUI已经存在更长的时间,因此毫无疑问它是当前拥有最佳工具共识的。Closure对我们来说是新的,因此与YUI相比,Closure没有那么丰富的经验。因此,我认为你不会发现有什么令人信服的真实世界的论据去使用Closure,仅因为它是新的。

这并不是说你不应该使用Closure...只是我的拐弯抹角地说,我认为在一些人使用这两个工具并进行比较之前,还没有可以回答这个问题的答案。

编辑: 有一些早期的比较,称Closure确实提供了改进: http://blog.feedly.com/2009/11/06/google-closure-vs-yui-min/
http://news.ycombinator.com/item?id=924426

进一步编辑: 值得关注Closure的问题列表:http://code.google.com/p/closure-compiler/issues/list


14

根据我看到的比较,Closure 在最小化文件大小方面似乎是明显的赢家。该文章使用了三个流行的 JS 库(jQuery、Prototype、MooTools)来比较 YUI Compressor 和 Closure Compiler 之间的压缩: http://www.bloggingdeveloper.com/post/Closure-Compiler-vs-YUI-Compressor-Comparing-the-Javascript-Compression-Tools.aspx

Closure 在每个测试中都排名第一,特别是在其高级模式下,它通过提供近60%的压缩率,比YUI Compressor 能将代码大小最小化的程度提高了约20-25%。


10

闭包可以用于简单模式或高级模式。简单模式对大多数JavaScript代码来说相当安全,因为它只会重新命名函数中的局部变量以实现更进一步的压缩。

高级模式则更加激进。它将重命名对象字面量中的键,并且如果能够确定它们返回没有副作用的简单值,则内联函数调用。

例如:

function Foo()
{
  return "hello";
}

alert(Foo());

被翻译为:

alert("hello");

而这段代码:

var o = {First: "Mike", Last: "Koss"};
alert(o);

被翻译为:

alert({a:"Mike",b:"Koss"});

您可以通过对名称加上引号,防止高级模式更改对象字面量中的键值:

{'First': "Mike", 'Last': "Koss"}
你可以在谷歌的交互式Closure Compiler网站上尝试这些和其他示例。

Closure Compiler甚至可以将函数的内部直接嵌入,从而大大加快代码的速度。 - Nosredna
Closure Compiler 在简单模式下会内联函数,但不会跨全局函数进行内联。 - John

7

看起来jQuery 1.5刚刚转移到了UglifyJS:

此外,随着这个转换,我们已经从Google Closure Compiler切换到使用UglifyJS。我们发现在使用它时文件大小有了明显的改善,所以我们对这个转换非常满意。


谢谢您发布这个信息。我甚至都没有听说过它! - Sonny
它比YUI更快,压缩效果更好,而且肯定比安装Java来使用Closure编译器要好。 - rxgx
不再正确:http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_compress_my_code.3F - SeanDowney
3
我在 https://github.com/jquery/jquery/blob/master/Makefile 中看到 COMPILER = ${JS_ENGINE} ${BUILD_DIR}/uglify.js --unsafe - Kevin Hakanson
他们的构建说明中写道,“使用Uglify.js进行缩小,使用JSHint进行代码检查” https://github.com/jquery/jquery - Sonny

5
我认为这取决于你的代码。如果你想编译自己的代码,那么我认为值得修补代码,使其与Closure Compiler兼容(有些事情可能一开始看起来有点笨拙)。我相信Closure Compiler很快将成为此类工作的首选,它还将使您整理代码并保持一致的风格(当然这取决于您的偏好,您可能会讨厌某些部分,我也是:P)。
如果您依赖其他库,则在我看来,您应该等待一段时间,直到它们发布与Closure Compiler兼容的版本。对于大多数流行的库来说,这不应该需要太长时间。也许您可以为那些您自己使用的“不太活跃”的库提供修复。
我在这里谈论的是“高级编译”模式,正如一些人指出的那样,“简单编译”模式是相当安全的。
这里有一个不同的观点-Google Closure?我不感到印象深刻。这可能有点太苛刻了,但是阅读起来很愉快。我想只有时间能告诉我们哪个更好=)

因为它不允许你使用 eval() 吗? - rxgx

3

1
YUI Compressor仍在开发中,虽然最后一次发布是在2013年5月: http://www.yuiblog.com/blog/2013/05/16/yuicompressor-2-4-8-released/ https://github.com/yui/yuicompressor - benebun

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接