检查javascript是否缺少“文本”&引用;压缩前

检查javascript是否缺少“文本”&引用;压缩前,javascript,compression,Javascript,Compression,我正在做一些优化,并决定使用压缩我的javascript文件。问题是,一些代码行最后缺少“;”,因为javascript允许这样做,而开发人员也不太关注这一点 当代码被压缩时会有问题吗?如果是,有没有办法检查javascript中缺少“;”的行 可以检查您的代码。是的,它很可能会导致问题,除非压缩器实际包含JavaScript解析器并主动修复丢失的分号。您可以始终使用regexp来匹配没有分号的换行符;在它们之前,自然会对空行等内容进行例外处理 但老实说,如果它真的没有自动完成这类工作,看起来它

我正在做一些优化,并决定使用压缩我的javascript文件。问题是,一些代码行最后缺少“;”,因为javascript允许这样做,而开发人员也不太关注这一点


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

可以检查您的代码。是的,它很可能会导致问题,除非压缩器实际包含JavaScript解析器并主动修复丢失的分号。

您可以始终使用regexp来匹配没有分号的换行符;在它们之前,自然会对空行等内容进行例外处理


但老实说,如果它真的没有自动完成这类工作,看起来它真的坏了。

根据,YUI压缩程序可以处理它。

我在三个JavaScript压缩程序上做了一个简单的测试:Yuicompressor、Yuglify和Google Closure编译器。在我的装有Ubuntu 12.10的PC上,我下载了每个压缩机的二进制文件,然后在每个压缩机上测试了这个文件:

function dbz(){
    var goku = 1
    var vegeta = 2
    var freeza = 3
    console.log(goku + vegeta + freeza)
}
dbz()
结果如下:

YUI压缩机(2.4.7):

尤格利菲(0.1.2):

闭包编译器(版本20121212修订版2388):


尽管这是一个非常简单的例子,但所有这些都可以很好地处理缺少分号的行。他们都检测到结尾没有分号的行,添加了它,然后删除了换行符。

我不熟悉YUI Compressor,但是如果它改变了语法有效javascript的语义,那么它就被破坏了……如果你在没有分号的javascript中删除换行符,它就会被破坏。。压缩机没有损坏。除此之外,分号使用不当的IMO JavaScript也被破坏了。。他们真的应该搞砸向后兼容性并强制使用分号。。或者至少添加一个模式来强制执行它(是否
使用strict;
已经这样做了?@ThiefMaster我觉得很遗憾,这么多人认为分号在某种程度上减少了代码中的问题数量,或者ASI在某种程度上难以“纠正”。我可以用手指数一数代码中分号的数量。一个不懂JavaScript的JavaScript工具被破坏了。一个使用分号“因为它们需要在那里”的程序也同样失败。(我并不反对在JavaScript中使用分号的程序员,只反对那些不能欣赏其他人以不使用分号的风格编写代码的人)。这也会伤害你的感情(首先引用jsLint.com)@ThiefMaster您错误地认为缺少分号会导致“糟糕的代码”。事实并非如此。蹩脚的代码就是蹩脚的代码——分号与否(或者“传递”jsLint与否)。好代码就是好代码——分号与否。jsLint不仅抱怨缺少分号,而且还抱怨其他可能意味着代码糟糕的事情。但我认为省略分号会让代码有点糟糕。@ThiefMaster除了“某某(在JavaScript中插入著名名称)说是这样”之外,你能给出一个很好的理由来解释为什么缺少分号会“让代码糟糕”吗?我打赌我可以用一个反对分号的案子来反驳它。(顺便说一句:如果ASI使代码“神秘”或“模糊”,那么与ASI无关的代码已经存在问题)。@ThiefMaster该问题实际上被错误地归因于ASI的问题。问题在于
return
实际上是一种“受限生产”(共有5种)——如果没有ASI,同样的问题也会存在。下面是对该问题的一个很好的解释,以及如何在一行可以继续表达式时编写安全的无分号代码:。请参阅底部的“误解”部分。根据docs():保留不必要的分号(例如“}”前面的分号),当压缩代码必须通过JSLint运行时(例如YUI),此选项非常有用。所以,这并不是…对这类事情使用正则表达式的最佳方法(一般来说:-),但您可能对它感兴趣。它不会正确地缩小所有代码,但它在大多数代码中都做得很好,并且解释了(文本替换)规则,并指出了该方法的一些局限性。欢迎来到SO,这里解释得很好。我实际上已经在我的一个Drupal站点上使用了它,但还没有读到它的实际工作原理。谢谢你的欢迎!
function dbz(){var b=1;var c=2;var a=3;console.log(b+c+a)}dbz();
function dbz(){var e=1,t=2,n=3;console.log(e+t+n)}dbz();
function dbz(){console.log(6)}dbz();