你用什么来最小化和压缩 JavaScript 库?
你用什么来最小化和压缩 JavaScript 库?
我已经使用YUI Compressor很长时间了并且没有遇到任何问题,但最近开始使用Google Closure Compiler并取得了一些成功。到目前为止我对它的印象:
- 在减少文件大小方面,它通常优于 YUI Compressor。简单模式下少量,高级模式下大量。
- 迄今为止,简单模式与 YUI Compressor 一样可靠。我喂过的任何东西都没有显示出任何问题。
- 高级“编译”模式对于某些脚本来说非常有用,但是脚本大小的显着减小是以对代码进行大量干预为代价的,而这些代码很有可能会破坏它。有一些方法可以处理其中一些问题,了解它在做什么可以大大避免出现问题,但我通常会避免使用这种模式。
我已经转而在简单的“编译”模式下使用 Google Closure Compiler,因为它总体上略胜过 YUI Compressor。我使用它的次数比使用 YUI Compressor 少得多,但从目前我看到的情况来看,我会推荐它。
我还没有尝试但听起来很有希望的另一个是Mihai Bazon 的 UglifyJS。
我使用YUI 压缩器。似乎可以很好地完成工作!
你在这里有很多可能性:
- 其他答案提到的YUI Compressor,
- 在谷歌关闭编译器,
- 他们的构建系统使用的Dojo ToolKit的 ShrinkSafe 编译器,
- 道格拉斯·克罗克福德仍然是真正的JSMin,
- 其他人提到的UglifyJS,
- 还有一个商业解决方案,javaScript Obfuscator(个人没用过)
根据我的个人经验,我建议您使用 Dojo SDK 构建自定义构建,然后您可以将其配置为使用他们常用的 ShrinkSafe 编译器或 Google Closure,它们现在也支持。
就压缩而言,我认为 Google Closure 是迄今为止对我来说效果最好的一个,但是我通常对 ShrinkSafe 感到满意,而且它有点老而且更健壮,而 Closure Compiler 看起来有点像块上的新孩子(例如,您的利益相关者可能不太喜欢)。
不过,有些人只对 YUI Compressor 发誓。我个人不能真正保证它。
现在,如果您的问题是压缩库而不仅仅是您自己的 JavaScript 代码,它显然会变得更加复杂,因为您将需要大多数这些工具来导出不应重命名或剥离的符号。大多数体面的压缩器会删除他们认为未使用的功能 - 通常是在库中的情况,如果没有绑定到项目,显然 - 并更改名称以使其更短并使用更少的字符 - 这也是一个问题,因为您显然想要一个公共API 不可篡改。
您也可以找到有关此主题的其他主题,并在工具的支持文档中找到信息。您可能还想看看JSBuilder2,它是用于 ExtJS(使用 YUI 压缩器)的 Dojo 构建工具的某种挂件(因此,使用 ShrinkSafe 或 Closure Compiler)。
(抱歉,作为一名 SO 新用户,我无法添加多个链接,因此无法直接链接到工具。)
编辑:关于一些答案中表达的担忧,即压缩可能会引入错误,并且由于代码没有被破坏,它使调试更容易:是的,这是一个有效的担忧。然而:
- 如果您使用压缩器,即使启用了 gzip 压缩,您也会在带宽方面获得非常显着的改善(并且您可以通过使压缩器的生活更轻松来学习利用 gzip 压缩
- 您应该在调试和生产模式下品尝您的代码,以确保行为相同。我的意思是,这也是你工作的一部分......
- 其中一些压缩器已经存在一段时间了,不会真正将错误引入您的代码中。他们真的只是重新组织事物并替换字符串,真的。
- 一些压缩器(例如 dojo 构建系统)带有选项,允许您生成压缩和未压缩的输出,以便您可以启用不同的调试和生产模式,例如使用查询参数。
我根本没有最小化 JavaScript:gzip 压缩对我来说已经足够了,并且还有一个额外的好处,即错误消息仍然有用。
我也使用 YUI Compressor。我有一个这样的蚂蚁任务,我在我的项目中使用:
<!--
YUI Compressor tasks
http://www.julienlecomte.net/yuicompressor/README
-->
<property name="yuicompressor.jar"
value="C:/devlibs/yuicompressor-2.2.4/build/yuicompressor-2.2.4.jar"/>
<target name="js.compress">
<!-- Create min directory under js direcrtory if it doesnt exist -->
<mkdir dir="${js-directory}/min" />
<apply verbose="true" executable="java" parallel="false" failonerror="true">
<fileset dir="${js-directory}" includes="*.js"/>
<arg line="-jar"/>
<arg path="${yuicompressor.jar}"/>
<srcfile/>
<arg line="-o"/>
<mapper type="glob" from="*.js" to="${js-directory}/min/*-min.js"/>
<targetfile/>
</apply>
</target>