22

我知道一个类似的问题,但这与我在这里提出的问题有点不同,所以不要重复flag

当你看到jQuery 的生产版本时,为什么过了一会儿会有换行符?我下载了一份副本并删除了所有换行符(除了许可证),它仍然有效。(我针对我在 Mozilla Firefox、Google Chrome 和 Opera 上所做的更改运行了整个单元测试套件。)

问题。 在谷歌浏览器的

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

我给自己分配了一个小挑战,从我的 JavaScript 代码中榨取每一点性能。

4

3 回答 3

26

jQuery 目前使用UglifyJS 来缩小其源代码。在他们的构建脚本中,他们专门将指令max_line_length设置为32 * 1024

UglifyJS的文档在max-line-len指令中有这样的说法;

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

于 2012-04-17T15:30:38.817 回答
13

引用Closure Compiler FAQ

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

这通常与任何缩小程序有关。

于 2012-04-17T15:26:23.397 回答
4

这些行(不包括许可证)的长度都在 30k 左右。可能是为了避免一些 Javascript 解析器在极长的行中死掉的错误。这可能不会在今天的浏览器上发生,但可能一些较旧或更晦涩的浏览器有这样的限制。


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

这可能是因为JSMin是一种流行的 Javascript 压缩器,在某些条件下会在输出中保留换行符。这是因为在 Javascript 中,例如,如果您省略分号,则换行很重要。文档说:

在省略换行方面更为保守,因为换行有时被视为分号。如果换行符位于非 ASCII 字符或 ASCII 字母或数字或以下字符之一之前,则不会省略换行符:

\ $ _ { [ ( + -

如果它跟在非 ASCII 字符或 ASCII 字母或数字或以下字符之一之后:

\ $ _ } ] ) + - " '

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

因此,这主要是为了防止意外删除语法上可能需要的换行符。你想要的最后一件事是你的缩小 JS 将不再工作,因为缩小器破坏了它的语义。

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

于 2012-04-17T15:11:53.730 回答