为什么我们在缩小的JavaScript中有换行符?

时间:2012-04-17 15:07:30

标签: javascript performance optimization minify

我知道一个similar question,但它与我在这里要求的内容相差无几,所以不要flag它是重复的。

当您看到production version of jQuery时,为什么会在一段时间后出现换行?我下载了一份副本并删除了所有新行(除了许可证),它仍然有效。 (我针对Mozilla Firefox,Google Chrome和Opera上的更改运行了整个单元测试套件。)

The problem. In Google Chrome's "view source"

我知道三个换行符(不包括许可证)不会减慢它的速度,但仍然不是每一点都有帮助吗?

我给自己分了一个小小的挑战,从我的JavaScript代码中挤出一点点性能。

3 个答案:

答案 0 :(得分:25)

jQuery currently use UglifyJS缩小其源代码。在their build script中,他们specifically set max_line_length指令为32 * 1024

documentation for UglifyJS可以在max-line-len指令上说明这一点;

  

--max-line-len(默认32K字符) - 在大约32K字符后添加换行符。当所有代码都在大约670K的单行上时,我已经看到FF和Chrome都会呱呱叫。传递-max-line-len 0以禁用此安全功能。

答案 1 :(得分:13)

引用Closure Compiler FAQ

  

Closure Compiler故意每500次添加换行符   人物左右。防火墙和代理有时会损坏或忽略   大型JavaScript文件,行很长。每次添加换行符   500个字符可以防止此问题。删除换行符没有   对脚本语义的影响。对代码大小的影响很小,而且   编译器优化换行符位置以使代码大小   文件被压缩时惩罚甚至更小。

这与任何缩小计划有关。

答案 2 :(得分:4)

行(不包括许可证)的长度大约为30k个字符。这可能是为了避免一些Javascript解析器在非常长的行上死亡的错误。这可能不会发生在今天的浏览器上,但也许一些较旧或较为模糊的浏览器会有这样的限制。


(下面的旧答案,也可能适用,但在这种情况下不适用)

这可能是因为JSMin,一个流行的Javascript minifier将在某些条件下保留输出中的换行符。这是因为在Javascript行中,如果省略分号, 是重要的。文档说:

  

省略换行更为保守,因为换行有时被视为分号。如果换行符在非ASCII字符或ASCII字母或数字或其中一个字符之前,则不会省略换行符:

\ $ _ { [ ( + -
     

如果它遵循非ASCII字符或ASCII字母或数字或其中一个字符:

\ $ _ } ] ) + - " '

其他缩小器可能有类似的规则。

因此,这主要是防止在语法方面意外删除可能必需的换行符的预防措施。你想要的最后一件事是你的缩小的JS将不再起作用,因为minifier破坏了它的语义。

关于»我知道三个新行(不包括许可证)不会减慢它的速度,但是,仍然不是每一点都有帮助吗?«:当你的服务器使用gzip时压缩差异可能无论如何都是没有意义的。