为啥我们在缩小的 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 中的每个换行符添加数字