我应该使用JSLint还是JSHint JavaScriptvalidation?

我目前正在validation我的JavaScript对JSLint并取得进展,它正在帮助我编写更好的JavaScript – 特别是在使用Jquery库时。

我现在遇到了JSHintJSLint的一个分支。
所以我想知道的是Web应用程序,这是非常多的JavaScript驱动,这是更好或最适用的validation工具来对付:

  • JSLint或JSHint?

我想现在就决定一个validation机制,并向前推进,使用它进行客户端validation。

jshint和jslint之间的区别? 请在单个javascript例子中解释。

链接:

  1. jshint – http://www.jshint.com/

  2. jslint – http://jslint.com/

[编辑]
这个答案已被编辑。 我将下面的原始答案留给上下文(否则评论就没有意义了)。

当最初提出这个问题时,JSLint是JavaScript的主要工具。 JSHint是JSLint的一个新分支,但是与原来的分歧还很大。

从那以后,JSLint一直保持静态,而JSHint已经发生了很大的变化 – 它抛弃了JSLint更多的对抗性规则,增加了大量的新规则,并且通常变得更加灵活。 此外,现在还有另一个工具ESLint,它更加灵活,并且有更多的规则选项。

在我原来的答复中,我说过你不应该强迫自己坚持JSLint的规则, 只要你明白为什么要发出警告,你可以自己判断是否改变代码来解决警告。

从2011年起JSLint的超严格规则集,这是合理的build议 – 我已经看到很less的JavaScript代码集可以通过JSLinttesting。 然而,在今天的JSHint和ESLint工具中使用更实用的规则,试图让你的代码通过零警告通过它是一个更现实的build议。

有时可能还会有一些情况,比如说,你知道你应该总是使用===但是这只是你有一个很好的理由来使用== 。 但是,即使如此,在ESLint中,您可以select在相关行的周围指定eslint-disable ,这样您仍然可以通过linttesting,并发出零警告,其余代码遵守规则。 (不要经常这样做!)


[原文如下]

通过一切手段使用JSLint。 但是,不要挂在结果上,要修复它所警告的一切。 它会帮助你改进你的代码,它会帮助你find潜在的错误,但并不是所有JSLint抱怨的事情都是一个真正的问题,所以不要觉得你必须完成这个过程,并且没有任何警告。

几乎任何长度或复杂的Javascript代码都会在JSLint中产生警告,不pipe写得多好。 如果你不相信我,试着运行一些stream行的库,比如JQuery。

一些JSLint警告比其他警告更有价值:学习哪些警告,哪些警告不那么重要。 应该考虑每一个警告,但是不要觉得有必要修复你的代码来清除任何给定的警告。 查看代码并确定您对此感到满意是完全可以的; 有些时候JSlint不喜欢的东西实际上是正确的。

tl; dr外卖

如果你正在为自己或团队寻找一个非常高的标准,JSLint。 但是它不一定是标准,只是一个标准,其中一些标准来自一个叫做Doug Crockford的javascript之神。 如果你想变得更加灵活一点,或者在团队中有一些老的专业人士不会购买JSLint的意见,或者定期在JS和其他C系列语言之间来回切换,请尝试JSHint。

长版

为什么JSHint存在,叉子的原因很好解释:

http://badassjs.com/post/3364925033/jshint-an-community-driven-fork-of-jslint http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to -jshint /

所以我想这个想法是它是“社区驱动的”,而不是克罗克福德驱动的。 实际上,JSHint对于JSLint坚持的一些样式和次要语法“意见”通常稍微宽松(或至less可configuration或不可知)。

举个例子,如果你认为下面的A和B都是好的,或者如果你想用B中没有的A的一个或多个方面编写代码,JSHint就是为你准备的。 如果你认为B是唯一正确的select… JSLint。 我相信还有其他的差异,但是这突出了一些。

答)通过JSHint开箱 – 失败JSLint

 (function() { "use strict"; var x=0, y=2; function add(val1, val2){ return val1 + val2; } var z; for (var i=0; i<2; i++){ z = add(y, x+i); } })(); 

B)通过JSHint和JSLint

 (function () { "use strict"; var x = 0, y = 2, i, z; function add(val1, val2) { return val1 + val2; } for (i = 0; i < 2; i += 1) { z = add(y, x + i); } }()); 

就我个人而言,我发现JSLint代码非常好看,我不同意的唯一难点在于它对函数中的多个var声明的仇恨以及for循环var i = 0声明和一些空白函数声明的强制。

JSLint实施的一些空白的东西,我发现不一定是坏的,但与家族中其他语言(C,Java,Python等)的一些非常标准的空白约定不同步,在Javascript中也遵循惯例。 由于我一天到晚都在用这些语言编写各种各样的语言,并且与我们的代码中不喜欢Lint风格的空白的团队成员合作,我发现JSHint是一个很好的平衡。 它捕获的东西是一个合法的错误或非常糟糕的forms,但不像JSLint那样对我咆哮(有时,我不能禁用)的风格意见或我不在乎的句法nitpicks。

许多优秀的库不是Lint'able,这对我来说certificate了一些JSLint仅仅是推动“好代码”(实际上是好代码)的一个版本。 但是,再一次,同样的图书馆(或其他好的图书馆)可能也不是可以提示的,所以,touché。

在javascript ESLint前端还有另一个成熟和积极开发的 “玩家” – ESLint

ESLint是识别和报告ECMAScript / JavaScript代码中find的模式的工具。 在许多方面,它与JSLint和JSHint类似,但有一些例外:

  • ESLint使用Esprima进行JavaScriptparsing。
  • ESLint使用AST来评估代码中的模式。
  • ESLint是完全可插入的,每一条规则都是一个插件,你可以在运行时添加更多。

这里真正重要的是它可以通过自定义插件/规则扩展 。 已经有多个插件用于不同的目的。 其中包括:

  • eslint-plugin-angular (强制John Papa的Angular Style Guide中的一些准则)
  • eslint-插件,茉莉
  • eslint-插件骨干

而且,当然,您可以使用您select的构build工具来运行ESLint

  • 咕噜,eslint
  • 一饮而尽,eslint

几周前我也有同样的问题,正在评估JSLint和JSHint。

与这个问题的答案相反,我的结论并不是:

通过一切手段使用JSLint。

要么:

如果你正在为自己或团队寻找一个非常高的标准,JSLint。

正如你可以在JSHint中configuration和JSLint 几乎相同的规则。 所以我会争辩说,你可以达到的规则没有太大的差别。

所以select一个的理由比技术更具政治性。

我们终于决定使用JSHint,原因如下:

  • 似乎是更可configuration的JSLint。
  • 看起来更多的是社区驱动,而不是一个人的表演(不pipe这个人有多酷)。
  • JSHint更符合我们的代码风格OOTB,JSLint。

我会提出第三个build议, Google Closure编译器 (还有Closure Linter )。 你可以在这里尝试一下 。

Closure编译器是一个使JavaScript下载和运行速度更快的工具。 这是一个真正的JavaScript编译器。 它不是从源语言编译成机器码,而是从JavaScript编译成更好的JavaScript。 它parsing你的JavaScript,分析它,删除死代码并重写,最大限度地减less剩下的东西。 它还检查语法,variables引用和types,并警告常见的JavaScript陷阱。

那么,而不是做手动lint设置,我们可以包括所有的lint设置在我们的JS文件本身的顶部,例如

声明该文件中的所有全局variables,如:

 /*global require,dojo,dojoConfig,alert */ 

声明所有的lint设置,如:

 /*jslint browser:true,sloppy:true,nomen:true,unparam:true,plusplus:true,indent:4 */ 

希望这会帮助你:)

前言:那么这个升级很快。 但决定把它通过。 愿这个答案对你和其他读者有所帮助。

我在这里被带走了一点

代码提示

尽pipeJSLint和JSHint是很好用的工具,但多年来,我逐渐体会到我的朋友@ugly_syntax所说的:

更小的devise空间

这是一个普遍的原则,就像一个“禅宗僧侣”,限制人们的select,可以更有效率和创造性。

所以我目前最喜欢的零configurationJS代码风格:

StandardJS 。

更新

Flow已经提高了很多。 有了它,你可以添加types到你的JS,将帮助你防止大量的错误。 但它也可以保持你的方式,例如,当接口无types的JS。 试一试!

快速启动/ TL; DR

添加standard作为依赖项目

 npm install --save standard 

然后在package.json ,添加以下testing脚本:

 "scripts": { "test": "node_modules/.bin/standard && echo put further tests here" }, 

为了在开发时快速输出, npm install --global snazzy并运行它而不是npm test

注意:types检查与启发式

当提到devise空间时,我的朋友提到榆树 ,我鼓励你试试这种语言。

为什么? JS实际上是受LISP的启发,LISP是一种特殊的语言types ,恰好是无types的 。 像Elm或Purescript这样的语言是types化的函数式编程语言。

types限制你的自由,以便编译器能够检查和指导你,当你最终违反语言或你自己的程序的规则; 不pipe你的程序的大小(LOC)。

我们最近有一位初级同事实施了两次反应式界面:一次在榆树,一次在React; 看一看我在说什么。

比较Main.elm (键入) Main.elm (无types,无testing)

(注意,React代码不是惯用的,可以改进)

最后一句话,

现实是JS 无types的。 我该向谁推荐打字编程

看到,与JS我们是在一个不同的领域:从types中解放出来,我们可以很容易地expression的东西是很难或不可能给一个适当的types(这当然可以是一个优势)。

但是如果没有types,我们的程序就不会被检查,所以我们不得不引入testing和代码样式。

我build议你看看LISP(例如ClojureScript )的灵感,并投资testing你的代码。 阅读亚行的想法。

和平。

还有另外一个积极开发的替代scheme – JSCS – JavaScript Code Style :

JSCS是一个代码风格的linter程序强制你的风格指南。 您可以使用150多种validation规则来详细configurationJSCS,包括jQuery,Airbnb,Google等stream行样式指南中的预设。

它带有多个预设 ,您可以通过简单地指定.jscsrcconfiguration文件中的preset并自定义它 – 覆盖,启用或禁用任何规则:

 { "preset": "jquery", "requireCurlyBraces": null } 

也有stream行编辑器的插件和扩展。

另请参阅:

  • 完美的代码,零努力