最佳JavaScript压缩器

174

什么是最好的JavaScript压缩工具?我正在寻找一个具有以下特点的工具:

  • 易于使用
  • 具有高压缩率
  • 可以产生可靠的最终结果(不会弄乱代码)

14
谁知道2011年的情况? - Dan
4
现在是2012年,我认为UglifyJS和Closure是胜者,我使用UglifyJS,通常它能够击败其他任何工具。 - mkoistinen
我在我的jQuery Mobile多页面应用程序中使用http://htmlcompressor.com/compressor.html。它接受一个带有<script>标签的HTML文件,并压缩HTML、JavaScript和CSS。非常好用。 - Anders
现在是2017年,最新的是什么? - Abhinav Singi
2020年了。使用默认的“安全”配置,UglifyJS略胜一筹,因为它更“安全”。对于高级用途,Closure Compiler则胜过UglifyJS。使用ADVANCED_OPTIMIZATIONS选项的Closure Compiler可以执行各种技巧,帮助您同时优化工作流程和代码。请参见https://dev59.com/SXVC5IYBdhLWcg3wcw0m#50355530,了解Closure Compiler的强大功能(免责声明:我找不到其他合适的博客文章,所以只能引用我写的文章)。 - Jack G
13个回答

150
我最近发布了 UglifyJS,它是一个用 JavaScript 编写的 JavaScript 压缩器(在 NodeJS Node.js 平台上运行,但可以很容易地修改为在任何 JavaScript 引擎上运行,因为它不需要任何 Node.js 内部)。它比 YUI CompressorGoogle Closure 都要快得多,在我测试的所有脚本中,它的压缩效果都比 YUI 更好,并且比 Closure 更安全(知道如何处理 "eval" 或 "with")。
除了删除空格之外,UglifyJS 还会执行以下操作:
  • 更改本地变量名称(通常为单个字符)
  • 合并连续的变量声明
  • 避免插入任何不必要的括号、圆括号和分号
  • 优化IF语句(在检测到不需要时删除"else",尽可能将IF语句转换为&&、||或?/:运算符等)。
  • 在可能的情况下将foo["bar"]转换为foo.bar
  • 在对象字面量中删除键中的引号,如果可能的话
  • 当这导致更小的代码时解析简单表达式(1+3*4 ==> 13)

PS:哦,它也可以“美化”。;-)


17
我们在企业级应用中使用了uglify。它的表现很不错。 - gyorgyabraham
你能否在Node上与jsmin进行比较? - Gringo Suave
最近 Uglify 放弃了 API 调用。 - Gadelkareem
@mishoo 你好,我很喜欢你的Uglify JS2。最近我的网络不太稳定,我想在Windows上使用它。有什么解决方案吗?:o) - user5066707
@mishoo 我展示了Git链接,但不知道如何使用它。 - Sachin Sarola

126

几年后重新审视这个问题,UglifyJS 看起来是目前最好的选择。

如下所述,它运行在 NodeJS 平台上,但可以轻松修改以在任何 JavaScript 引擎上运行。

--- 以下是旧答案 ---

谷歌发布了 Closure Compiler,似乎生成的文件迄今为止是最小的,如 herehere 所示。

在此之前,各种选项 were as follow

基本上,Packer 在初始压缩方面做得更好,但如果您在发送到网络时会使用 gzip 压缩文件(您应该这样做),则 YUI Compressor 可以获得最小的最终大小。

测试是在 jQuery 代码上进行的。

  • 原版jQuery库大小为62,885字节,gzip压缩后为19,758字节
  • 使用JSMin进行压缩的jQuery大小为36,391字节,gzip压缩后为11,541字节
  • 使用Packer进行压缩的jQuery大小为21,557字节,gzip压缩后为11,119字节
  • 使用YUI压缩器进行压缩的jQuery大小为31,822字节,gzip压缩后为10,818字节

@daniel james评论中提到了compressorrater,它显示Packer压缩在最佳压缩方面处于领先地位,所以我想你的结果可能会有所不同。


Packer有一个选项可以进行“base62编码”,对于jQuery来说,它在gzip压缩后比yui更小。这是因为jQuery使用了“eval”和“with”,这会阻止“安全”的压缩器进行某些压缩,但是packer会忽略它们。总的来说不太安全,但是jQuery已经经过了Packer的测试。 - Daniel James
另外,如果你不相信我,可以尝试访问http://compressorrater.thruhere.net/。 - Daniel James
9
不要忘记使用打包工具的缺点——解压时间。 - Nosredna
1
注意,Google Closure有时可能是最糟糕的压缩器(输出甚至比原始文件还大)- 它默认将字符串中的非ASCII字符转换为\uxxxx字面量。如果您确定已经让浏览器知道,请使用例如--charset UTF-8 - mykhal
ClosureCompiler的输出对我不起作用。http://jscompress.com可以使用。 - codenamezero
YUI压缩后的gzip文件比Closure压缩后的文件要大。请查看此链接 - Alvaro

43

YUI Compressor 是不错的选择,它具有很高的压缩率,在许多顶尖网站中得到了广泛应用,也是我个人推荐的。

我在自己的项目中使用过它,没有出现任何 JavaScript 错误或问题,并且它有良好的文档。

虽然我从未使用过它的 CSS 压缩功能,但它同样有效。 CSS 压缩也同样有效。

注意:虽然 Dean Edwards 的 /packer/ 能够比 YUI Compressor 达到更高的压缩率,但我使用它时遇到了一些 JavaScript 错误。


5
Packer在文件大小方面看起来不错,但事实证明,解压时间通常超过通过管道传输较小文件所节省的时间。根据我见过的大多数浏览器基准测试结果,在浏览器执行时间方面,使用gzip无压缩文件原始服务要比Packer慢。 - Colonel Sponsz
这是一个基准测试:http://www.ericmmartin.com/comparison-of-javascript-compression-methods/ - Colonel Sponsz
如果您不想处理Java运行问题,这里有一个在线版本的压缩器:http://refresh-sf.com/yui/ - Bryan Legend
使用Packer压缩的脚本不需要解压,除非您勾选了Base62编码选项(您不应该这样做,因为它是一个门外汉的gzip - 我相信大多数现代服务器都支持gzip)。对于经过base62编码的文件进行gzip压缩没有意义,因为已经没有冗余可供利用。最新版本的Packer(最终版本)不会引入错误,不会有解压开销(只要您不进行base62编码),并且仍然实现了最大的压缩效果。此外,现在还有一个命令行版本的Packer。只需使用npm按如下方式安装即可:npm install packer - Aadit M Shah

8
我使用Dojo项目中的ShrinkSafe - 它非常出色,因为它实际上使用了JavaScript解释器(Rhino)来处理代码中的符号和理解它们的作用域等,这有助于确保代码在输出时能够正常运行,而许多压缩工具则使用regex来完成相同的操作(这不太可靠)。
实际上,在我的当前Visual Studio解决方案中的Web Deployment Project中有一个MSBuild任务,它在部署之前会将所有解决方案的JS文件通过ShrinkSafe运行一遍,效果很好。 编辑: 顺便说一句,“最佳”是可以讨论的,因为“最佳”的标准会因项目需求而异。个人认为ShrinkSafe是一个很好的平衡点;对于那些认为最小体积==最佳的人来说,它可能不够。

编辑:需要注意的是,YUI压缩器也使用了Rhino。


5
尝试使用 JSMin,它有C#、Java、C以及其他版本,且易于获取。

C#的移植版已经被移动或删除了吗? - Greg B

4
如果您使用Packer,请选择“缩小变量”选项并gzip压缩生成的代码。base62选项仅适用于您的服务器无法发送gzipped文件的情况。使用“缩小变量”的Packer比YUI实现更好的压缩,但如果您在某个地方跳过了分号,则可能会引入错误。
base62基本上是穷人版的gzip,这就是为什么对base62编码的代码进行gzip压缩会比缩小变量的代码得到更大的文件。

3

2

1

Js Crush 是一个很好的压缩工具,适用于你已经进行了代码最小化之后。


1

KJS压缩器

http://opensource.seznam.cz/KJScompress/index.html

Kjscompress/csskompress是一组包含kjscompress和csscompress两个应用程序的工具,用于从包含JavaScript和CSS的文件中删除非重要的空格和注释。它们都是GNU/Linux操作系统的命令行应用程序。

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