压缩后的JavaScript会发生什么变化?其中包括注释。

10

压缩后的 JavaScript 文件中的注释会发生什么?当所有内容都被压缩到一行时,浏览器怎么知道注释的结尾在哪里?以这个小例子为例,我有像这样的 Google 跟踪代码:

//Google tracking
var _gaq = _gaq || []; 
_gaq.push(['_setAccount', '123456']); 

压缩版本将所有内容放在一行中

// Google tracking var _gaq = _gaq || []; _gaq.push(['_setAccount', '123456']);

有更多的语句,但是当我在编辑器中查看JavaScript代码时,它看起来像一个巨大的注释(或多或少)。是否存在隐藏字符告诉浏览器何时结束注释,还是该代码未被执行?


2
你使用的是哪个压缩工具?压缩工具的作用是尽可能地消除字符,特别是注释之类的内容。(以及在你的情况下空格。) - pimvdb
你使用什么工具来压缩脚本? - JaredPar
2
取决于压缩器,但我认为一个好的压缩器会完全排除注释。 - jondavidjohn
7
这并没有被完全压缩,只是去除了换行符。甚至空格都没有去除。那么这是哪个“压缩器”呢? - Linus Kleen
我自己没有压缩脚本,所以不知道使用了什么。我是从客户那里得到的,并且最近才开始质疑是否会执行任何代码。 - Rondel
无论使用什么“缩小器”,它都是一坨垃圾。 - user1203803
2个回答

7
缩小文件大小的程序会删除注释或插入换行符。例如,Closure Compiler's FAQ 中说:

我可以将 Closure Compiler 与其他 JavaScript 缩小工具一起使用吗?

可以。Closure Compiler 可以读取任何有效的 JavaScript 并生成有效的 JavaScript,因此您可以在运行文件通过其他缩小工具之前或之后应用 Closure Compiler 到 JavaScript 文件中。

请记住,Closure Compiler 和其他缩小工具可能对输入代码有期望。例如,删除许可证或另一个工具所需的注释信息的缩小程序可能会影响其他工具。

有时您确实需要注释,在这种情况下,他们会插入一个换行符。

我有必须出现在我的源代码中的版权声明或开源许可证文本。如何防止 Closure Compiler 删除此文本?

Closure Compiler 支持 JSDoc @license 标签。将 @license 标签添加到任何 JSDoc 注释中即可保留注释并输出到编译器中。有关更多信息,请参见为 Closure Compiler 注释 JavaScript。

压缩工具有时会断开代码行,因为某些解释器的源代码解析器无法处理过长的行或运行速度非常慢。

https://bugzilla.mozilla.org/show_bug.cgi?id=634444

以前,由于我们处理的是块,因此错误消息中包含的行的长度有限制。但现在错误消息包含整个行。如果你有非常长的行和大量的错误,那么这将导致高内存使用率,特别是因为我们在错误消息字符串上调用了“js_DeflateString()”,从而导致两个副本(一个由“jschar”组成,另一个由“char”组成)。在相关网站上,一行包含122,895个字符的堆积错误,导致超过1G的“char”(每个“char”占3个字节!)被放入错误消息中。

4
JavaScript单行注释在遇到第一个换行符后结束。缩小器将在删除换行符之前删除注释,以使其不会破坏您的代码。
例如,如果您复制以下内容:
//GOOGLE TRACKING
var _gaq = _gaq || []; 
_gaq.push(['_setAccount', '123456']); 

将代码用简单的优化编译成 Closure Compiler 后,您将得到:
var _gaq=_gaq||[];_gaq.push(["_setAccount","123456"]);

通过先进的优化,您可以获得:

var a=a||[];a.push(["_setAccount","123456"]);

两者都会删除注释。


我敢打赌客户端的某个人试图手动“缩小”代码,结果得到了这个。感谢您的帮助。 - Rondel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接