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

Posted

技术标签:

【中文标题】为啥我们在缩小的 JavaScript 中有换行符?【英文标题】:Why do we have newlines in minified JavaScript?为什么我们在缩小的 JavaScript 中有换行符? 【发布时间】:2012-04-28 22:44:08 【问题描述】:

我知道similar question,但它与我在这里问的内容有点微小,所以不要将flag作为重复项.

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

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

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

【问题讨论】:

你能把相关的行包括进去吗? @JamesMontagne 你是什么意思? jQuery的? 您针对您的更改运行了整个单元测试套件? @AnishGupta 他的意思是,你说“它仍然有效”。您如何确定 一切 仍然有效?你运行单元测试了吗? 您的问题是专门针对 jQuery 生产库,还是一般而言? FWIW,jQuery 1.7.2 的行长分别是 32412 和 32770,所以这 almost 看起来像是保持在 2^15 个字符以下的情况。 【参考方案1】:

jQuery currently useUglifyJS 来缩小他们的源代码。在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 以禁用此安全功能。

【讨论】:

@AnishGupta 你没有得到什么?他们想要换行符。他们配置了他们的 minify 脚本,以便将换行符放在那里。 @AnishGupta 因为就像马特和其他人所说的那样,太长的行会导致某些浏览器出现问题。 @AnishGupta 很高兴你这样做 :) 如果对你有帮助,不要忘记考虑接受 Matt 的回答作为你问题的答案 最新版本的 FF 和 Chrome 是否如此?【参考方案2】:

引用Closure Compiler FAQ:

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

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

【讨论】:

感谢您的回答。我不知道。编辑:很奇怪,我前一阵子写的,但现在才出现??? 消息一定是被防火墙和代理卡住了。 从来不知道防火墙和代理会如此愚蠢。 PBFAP。另外,有人知道一个例子吗?我真的很怀疑有人可以编写如此糟糕的防火墙以至于它会破坏文件(并从仍在使用它的人那里获得报酬)。【参考方案3】:

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


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

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

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

\ $ _  [ ( + -

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

\ $ _  ] ) + - " '

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

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

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

【讨论】:

但是jQuery为什么不删除生产版本中的换行符 这些规则似乎与 where jQuery 1.7.2.min is split 无关;第一个在G=function(a) 之间,第二个在var a=f.clean(arguments); 之间 他们为什么要这样做?生产版本很可能会自动生成,无需人工查看。 @Joey 正如我在回答中所说的那样。每一点都有帮助。

以上是关于为啥我们在缩小的 JavaScript 中有换行符?的主要内容,如果未能解决你的问题,请参考以下文章

缩小 HTML、CSS 和 Javascript 是个坏主意吗?

使用 Javascript 从 Textarea 中的每个换行符添加数字

为啥我在vs 2012 写c++的时候 定义一个常量,值是中文会报错,error: C2001: 常量中有换行符?

压缩js和css文件的原理

跨度在 div 内浮动 - 为啥在 IE 中换行?

HTML textarea 忽略第一个换行符,为啥?