使用闭包编译器删除jQuery的未使用部分

时间:2011-05-13 14:01:13

标签: jquery minify google-closure-compiler

是否可以使用闭包编译器删除jQuery的未使用部分?

我有一个只使用jQuery网络(json)功能的脚本,而且我喜欢一个删除其他所有内容的缩小脚本。

我尝试用以下方式调用它:

    java -jar compiler.jar --compilation_level=ADVANCED_OPTIMIZATIONS --js=jquery-latest.js --js=my_script.js  --js_output_file=out.js

但我最终得到的文件不小于常规缩小的jQuery源代码。

编辑:我应该提一下背后的原因。此脚本将包含在第三方网站中,它需要更高版本的jQuery(1.5或1.6)。我认为最简单的处理方法是将最新版本捆绑在脚本中(仅适用于我的脚本,而不是触及window.jQuery),删除未使用的部分以减小大小。这样,如果他们已经有了旧版本的jQuery,它就不会干涉。

4 个答案:

答案 0 :(得分:6)

在jQuery中删除“unused”方法是不可能的,因为你可以用疯狂的方式调用方法,如:

<input id="test" value="hello!"/>

alert($('#test')[prompt('Method?')]()); // input "val" in the prompt box

闭包编译器不可能知道将使用哪些方法。

小提琴: http://jsfiddle.net/garreh/xDDXt/


正如一些旁注:

  • jQuery(1.6)的最新生产版本仅为31kb。通过适当的缓存控制,这将被下载一次并由浏览器在本地缓存。
  • 你可能会帮助自己优化通常尺寸更大的东西,即图像。
  • ...或减少浏览器请求,例如使用CSS精灵技术来更好地优化您的网站。
  • 将jQuery代码<script>标记放在页面底部,以实现更好的下载并行化。 http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/

答案 1 :(得分:5)

首先,对于死代码删除,您需要高级模式。我看到你已经在使用它了。

然后,必须编写代码以符合使用高级模式的严格限制。我想你已经完成了并彻底检查了你的代码 - 否则编译后的代码将无效。

然后你需要引用jQuery“externs”文件 - 你可以从Closure Compiler的网站上获得它。如果没有这个externs文件,Closure将重命名jQuery中不应该的属性和函数。

最后,jQuery没有编写与Closure Compiler的高级模式一起使用。有许多地方它创造了“别名”,无法优化。即使在代码库中的任何位置都有一个别名,整个jQuery对象也会被拉入其中。

简答:如果没有大量的工作就不可能将Closure编译器的高级模式与jQuery一起用于删除死代码。

Off-Topic:Dojo Toolkit是目前唯一可以在高级模式下与Closure Compiler一起使用的流行JavaScript库(Closure Library除外)。所有Closure Compiler的高级功能(例如死代码删除,方法虚拟化,名称空间展平等)都受到支持。

查看此链接以获取TODO文档:http://dojo-toolkit.33424.n3.nabble.com/file/n2636749/Using_the_Dojo_Toolkit_with_the_Closure_Compiler.pdf?by-user=t

答案 2 :(得分:1)

有很多原因使编译器不会对jQuery库做任何事情,从jQuery“export”本身开始:

window.jQuery = jQuery

在高级模式下,这个习惯用于告诉编译器在脚本外部使用一个值,因此对象本身永远不会被删除,名称层次结构将保持未拆分等等。

如果删除它,jQuery将自己嵌入到匿名函数函数包装器中,这会阻止许多ADVANCED模式的全局范围优化(名称层次结构,类型分析的类检测等)。

当你删除它时没有太大的变化,但我没有找到下一个问题。

答案 3 :(得分:-1)

请尝试ender

它的哲学是一组微观框架。不需要功能,然后不要将其构建为ender。

如果您只需要ajax,请将ajax模块添加到您的ender构建中。