10

是否可以使用闭包编译器来删除 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 源代码。

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

4

4 回答 4

6

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

<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 sprite 技术来更好地优化您的网站。
  • 将您的 jQuery 代码<script>标签放在页面底部,以实现更大的下载并行化。http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/
于 2011-05-13T14:11:12.837 回答
5

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

其次,必须编写代码以符合使用高级模式的严格限制。我想您已经完成了这项工作并彻底检查了您的代码——否则编译后的代码将无法工作。

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

最后,jQuery 不是为使用 Closure Compiler 的高级模式而编写的。它在许多地方创建了无法优化的“别名”。即使在代码库中的任何地方都有一个别名,整个 jQuery 对象都将被拉入其中,并且所有内容都在下面。

简短的回答:如果没有大量工作,就不可能将 Closure Compiler 的高级模式与 jQuery 一起使用来删除死代码。

题外话:Dojo Toolkit 是迄今为止唯一可以在高级模式下与 Closure Compiler 一起使用的流行 JavaScript 库(除了 Closure 库)。支持 Closure Compiler 的所有高级功能(例如,删除死代码、方法虚拟化、命名空间扁平化等)。

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

于 2011-05-14T09:15:13.823 回答
1

编译器不会对 jQuery 库做任何事情的原因有很多,首先是 jQuery“导出”本身:

窗口.jQuery = jQuery

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

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

但是,当您删除它时没有太大变化,但我没有寻找下一个问题。

于 2011-05-13T16:28:36.763 回答
-1

试试ender吧。

它的理念是一组组合的微框架。不需要功能,然后不要将其构建到 ender 中。

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

于 2011-05-13T14:42:20.587 回答