在压缩之前检查JavaScript代码是否缺少分号

5

我正在进行一些优化,并决定使用YUI Compressor压缩我的javascript文件。问题是,有些代码行末尾缺少“;”,因为javascript允许这样做,而开发人员并不太注意这个问题。

如果压缩代码会有问题吗?如果有问题,有没有办法检查缺少“;”的javascript代码行?


4
我不熟悉YUI压缩器,但如果它改变了语法上有效的JavaScript的语义,那么它就会出问题... - Jon
1
如果您在没有分号的JavaScript代码中删除换行符,它将会出错,而且即使压缩器工作正常也无法避免这种错误。除此之外,在我的看法中,如果JavaScript中分号的使用不正确,那么就是有问题的。他们应该真的抛弃向后兼容性并强制使用分号,或者至少添加一个强制使用分号的模式(use strict;是否已经实现了这一点?)。 - ThiefMaster
@ThiefMaster,我觉得很遗憾有这么多人认为分号可以减少代码问题或者自动插入分号机制很难“正确使用”。我的代码中分号的数量可以用手指头数出来。一个不理解JavaScript的JavaScript工具就是有问题的。一个程序员因为“必须加分号”而使用分号也同样有问题。(我并不反对在JavaScript中使用分号的程序员,只是那些不能欣赏其他人以无分号风格编写代码的人)。 - user166390
4个回答

9

jsLint 可以检查你的代码是否存在这些问题。如果压缩器实际上包含 JavaScript 解析器并积极修复缺少分号,那么它通常会引起问题。


yup,jsLint会检查这个。它也可能会伤害你的感情(来自jsLint.com的第一句话);) - Alfred
1
@ThiefMaster,你错误地认为缺少分号会导致“糟糕的代码”。事实并非如此。无论是有分号还是没有(或者是否通过 jsLint),糟糕的代码都是糟糕的,好的代码就是好的代码--有分号也好,没有分号也好。 - user166390
jsLint不仅会抱怨缺少分号,还会指出其他可能意味着代码质量较差的问题。但在我看来,省略分号会使代码变得有点糟糕。 - ThiefMaster
@ThiefMaster 除了“某某(在JavaScript中插入著名的名称)说”的理由外,你能给出一个缺少分号“使代码糟糕”的好理由吗?我敢打赌,我可以用反对分号的案例来反驳它。(顺便说一句:如果ASI使代码“神秘”或“模棱两可”,那么与ASI无关的代码已经存在问题)。 - user166390
1
@ThiefMaster 那个问题实际上被错误地归咎于 ASI 的问题。实际问题是 return 是一个“受限制的产生式”(有 5 个这样的产生式) - 即使没有 ASI,完全相同的问题也将存在。以下是该问题的很好的解释,以及如何在一行可能继续表达式时编写安全的无分号代码:JavaScript 分号插入 - 你需要知道的一切。请参见底部的“误解”部分。 - user166390
显示剩余2条评论

3

根据文档(http://developer.yahoo.com/yui/compressor/#using):保留不必要的分号(例如在“}”之前的右侧)。当压缩代码必须通过JSLint运行时(例如YUI的情况),此选项非常有用。因此,这并不会... - Silver Light

2

我对三个JavaScript压缩工具进行了简单的测试:Yuicompressor、Yuglify和Google Closure Compiler。在我的Ubuntu 12.10电脑上,我下载了每个压缩工具的二进制文件,并在每个压缩工具上测试了这个文件:

function dbz(){
    var goku = 1
    var vegeta = 2
    var freeza = 3
    console.log(goku + vegeta + freeza)
}
dbz()

以下是结果:

Yuicompressor (2.4.7):

function dbz(){var b=1;var c=2;var a=3;console.log(b+c+a)}dbz();

Yuglify (0.1.2):

function dbz(){var e=1,t=2,n=3;console.log(e+t+n)}dbz();

Closure-Compiler(版本20121212修订版2388):

function dbz(){console.log(6)}dbz();

虽然这只是一个非常简单的例子,但是所有没有分号的代码行都能正常工作。它们都可以检测出末尾没有分号的代码行,并添加上分号,然后删除换行符。


1

你可以使用正则表达式来匹配没有分号的换行符,并自然地对空行、)}等进行例外处理。

但说实话,如果它真的不能自动完成这种事情,那么它似乎真的是有问题的或者很糟糕。


在这种情况下(一般情况下:-),使用正则表达式可能不是最好的选择,但您可能会对jsmin的工作原理感兴趣。它不能正确地缩小所有代码,但它可以很好地处理大多数代码,并解释(文本替换)规则以及指出了该方法的一些限制。欢迎来到SO。 - user166390
讲解得很清楚。我已经在我的一个Drupal网站上使用它了,但还没有读懂它的实际工作原理。感谢欢迎! - red

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