为什么js压缩机没有这样做?

时间:2012-01-15 03:07:48

标签: javascript jquery

我总是想知道为什么js压缩机不这样做。假设我有一个像这样的缩小脚本:

(function($){var a=$("a");1<a.length&&10>a.length?alert(a.length):alert($("p").length)})(jQuery);

为什么不编译成这样的东西:

(function($,L){var a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length');

意味着用.property改变[minified key]的每一次出现,并将字符串和arg接收器传递给iife(基本上我在.length上做了什么)< / p>

想象一下,如果用159 .length,62 .each,15 .appendChild等来缩小jQuery的程度,只需.length s就可以节省超过600个字节!< / p>

同样使用上面的示例,当您可以通过声明另一个参数来保留该函数范围中的空间时,为什么它会浪费var关键字上的空间:

(function($,L,a){a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length');

另外,虽然我在这里,为什么不将整个jQuery放入eval并保存另外572 function个关键字(4.5k)?

3 个答案:

答案 0 :(得分:6)

我认为除了属性查找之外,它不想假设你想要变量查找的费用。

如果您使用Closure Compiler,如果您手动执行它,它实际上会撤消这些类型的引用。

最终,如果你gzip,我不认为这些混淆加起来很多。如果在某些情况下它实际上使你的gzip版本更大,我不会感到惊讶。

答案 1 :(得分:5)

因为它会改变代码的结构。您的提案现在提供的函数允许访问任何传入的属性名称,而不是使用对象的length属性进行操作的方法,而这可能违反原始代码的意图。

执行此操作可能还会对性能产生影响 - 或者至少,这可能会导致JavaScript运行时中的某些优化无法使用。

还要记住,大多数JavaScript源文件应该通过GZip压缩(大多数Web服务器/浏览器在HTTP级别透明地协商和完成) - 这将轻松压缩任何名称的任何重复实例,包括“var”和重用的财产名称。

答案 2 :(得分:3)

因为minifiers不应该更改代码功能,只删除不必要的字符。