我应该使用JSLint或JSHint JavaScript验证吗?

Should I use JSLint or JSHint JavaScript validation?

我目前正在用jslint验证我的javascript并取得进展,它帮助我编写更好的javascript——特别是在使用jquery库时。

我现在遇到了JShint,一个JSlint的分支。因此,我想知道Web应用程序,它非常受javascript驱动,这是更好或最适用的验证工具:

  • JSlint还是JShint?

我现在要决定一个验证机制,并继续前进,将其用于客户端验证。

JShint和JSlint之间的区别是什么?请用一个javascript示例进行解释。

链接:

  • jshint-http://www.jshint.com/

  • jslint-http://jslint.com/


  • 外卖:

    如果你在为自己或团队寻找一个非常高的标准,jslint。但它不一定是标准,只是一个标准,其中一些是从一个叫DougCrockford的javascript上帝教条主义地告诉我们的。如果你想更灵活一点,或者你的团队中有一些老的专业人员不认同JSlint的观点,或者经常在JS和其他C族语言之间来回走动,那么试试JShint。

    长版本:

    fork背后的推理很好地解释了为什么存在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/

    所以我想这个想法是"社区驱动"而不是Crockford驱动。在实用性方面,JShint通常对JSlint所依赖的一些风格和小语法"意见"比较宽松(至少是可配置的或不可知的)。

    举个例子,如果您认为下面的a和b都可以,或者您想用b中没有的a的一个或多个方面来编写代码,那么jshint就是为您准备的。如果你认为B是唯一正确的选择…JSLint。我相信还有其他的区别,但这突出了一些。

    a)将JShint从框中传递出来-JSlint失败

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (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);
        }
    }());

    我个人觉得jslin代码很好看,我唯一不同意的是它讨厌函数中的多个var声明和for循环var i = 0声明,以及一些用于函数声明的空白强制。

    JSLLT强制执行的一些空白空间,我发现不一定是坏的,但与家庭中的其他语言(C、Java、Python等)中的一些标准的空白空间约定不同步,它们也经常作为JavaScript中的约定来遵循。因为我一整天都在用各种语言写作,并且与不喜欢代码中的lint样式空白的团队成员一起工作,所以我发现jshint是一种很好的平衡。它捕捉到的东西是一个合法的错误或真的不好的形式,但不会像jslint那样对我咆哮(有时,以我不能禁用的方式),因为我不喜欢的风格观点或句法挑剔。

    很多好的库不支持lint't able,这在我看来证明了这样一个观点是有道理的:一些jslint仅仅是推送一个版本的"好代码"(实际上,这是一个好代码)。但是,同样的库(或者其他好的库)可能也没有提示,所以,触摸一下。


    [编辑]此答案已被编辑。我将保留下面的原始答案作为上下文(否则这些评论就没有意义)。

    当最初提出这个问题时,jslint是JavaScript的主要linting工具。JShint是JSlint的一个新分支,但与原始分支还没有太大的区别。

    从那时起,JSlint就保持了相当大的静态性,而JShint改变了很多——它抛弃了JSlint的许多更具对抗性的规则,增加了一大堆新规则,并且通常变得更加灵活。另外,另一个工具eslint现在也可以使用,它更加灵活,有更多的规则选项。

    在我最初的回答中,我说你不应该强迫自己遵守JSLint的规则;只要你理解它为什么发出警告,你就可以自己判断是否要更改代码来解决警告。

    有了2011年的超严格的JSlint规则集,这是合理的建议——我已经看到很少有能够通过JSlint测试的javascript代码集。然而,由于现在的JShint和eslint工具中提供了更实用的规则,因此尝试让您的代码在零警告的情况下通过它们是一个更现实的建议。

    有时,有些情况下,过梁会抱怨你有意做的事情——例如,你知道你应该总是使用===,但这一次你有充分的理由使用==。但是即使这样,使用eslint,您也可以选择在相关行周围指定eslint-disable,这样您仍然可以通过lint测试,并且没有警告,其余代码都遵守规则。(只是不要太频繁地做那种事!)

    [原始答案如下]

    无论如何使用jslint。但不要对结果和它警告的所有事情都心存疑虑。它将帮助您改进代码,并帮助您发现潜在的错误,但并不是JSLint抱怨的所有事情都是真正的问题,所以不要觉得您必须以零警告完成该过程。

    几乎任何长度或复杂性很高的JavaScript代码都会在JSlint中产生警告,不管它写得有多好。如果你不相信我,试着通过它运行一些流行的库,比如jquery。

    一些JSlint警告比其他警告更有价值:了解哪些警告值得注意,哪些警告不那么重要。应该考虑每个警告,但不要觉得有必要修改代码以清除任何给定的警告;查看代码并决定您对它满意是完全正常的;有时,JSLint不喜欢的事情实际上是正确的事情。.


    Javascript linting front上还有一个成熟且积极开发的"player"——ESLint

    ESLint is a tool for identifying and reporting on patterns found in
    ECMAScript/JavaScript code. In many ways, it is similar to JSLint and
    JSHint with a few exceptions:

    • ESLint uses Esprima for JavaScript parsing.
    • ESLint uses an AST to evaluate patterns in code.
    • ESLint is completely pluggable, every
      single rule is a plugin and you can add more at runtime.

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

    • Eslint Plugin Angular(强制执行John Papa的Angular Style Guide中的一些指导原则)
    • Eslint插件Jasmine
    • eslint插件主干

    当然,您也可以使用自己选择的构建工具来运行ESLint

    • 格兰特艾斯林
    • 狼吞虎咽


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

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

    By all means use JSLint.

    或:

    If you're looking for a very high standard for yourself or team, JSLint.

    因为您可以在JShint中配置几乎与JSlint中相同的规则。所以我想说,你所能达到的规则并没有什么不同。

    因此,选择一个而不是另一个的原因更多是政治上的而不是技术上的。

    我们最终决定使用jshint,原因如下:

    • 似乎比jslint更可配置。
    • 看起来更像是社区驱动,而不是一个人表演(不管这个人有多酷)。
    • JShint比JSlint更好地匹配了我们的代码风格ootb。


    前言:嗯,这很快就升级了。但还是决定挺过去。希望这个答案对你和其他读者有所帮助。

    I got a bit carried away here

    代码提示

    虽然JSlint和JShint是很好的工具,但多年来,我开始欣赏我的朋友@丑八怪语法所说的:

    smaller design space.

    这是一个普遍的原则,就像一个"禅僧",限制你必须做出的选择,你可以更富有成效和创造性。

    因此,我当前最喜欢的零配置JS代码样式:

    StandardJS.

    更新:

    流量提高了很多。有了它,你可以向JS添加类型,这将有助于防止虫子。但它也可以避开你,例如当连接非类型的JS时。试一试!

    快速启动/tl;dr

    添加EDOCX1[4]作为项目的依赖项

    1
    npm install --save standard

    然后在package.json中添加以下测试脚本:

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

    为了在开发过程中获得更高的输出,npm install --global snazzy并运行它而不是npm test

    注意:类型检查与启发式

    当我的朋友提到设计空间提到榆树时,我鼓励你尝试一下这种语言。

    为什么?JS实际上是受Lisp的启发,Lisp是一个特殊的语言类,恰好是非类型化的。ELM或purescript等语言是类型化的函数式编程语言。

    输入限制您的自由,以便编译器能够在您最终违反语言或您自己的程序规则时检查和指导您;而不管您的程序的大小(loc)。

    我们最近让一个初级同事实现了两次反应式接口:一次在ELM,一次在React;看看我在说什么。

    Compare Main.elm (typed) ? index.js (untyped, no tests)

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

    最后一句话,

    事实上JS是非类型化的。我是谁向你推荐打字编程?

    看,有了JS,我们进入了一个不同的领域:从类型中解放出来,我们可以很容易地表达那些难以或不可能给出合适类型的东西(这当然是一个优势)。

    但是如果没有类型,我们的程序就没有什么可检查的了,因此我们不得不引入测试和(稍微扩展一点)代码样式。

    我建议您从Lisp(例如Clojurescript)中寻找灵感,并投资于测试代码。阅读子序列的方式以获得一个想法。

    和平。


    我会提出第三个建议,google闭包编译器(还有闭包linter)。你可以在这里在线试用。

    The Closure Compiler is a tool for making JavaScript download and run faster. It is a true compiler for JavaScript. Instead of compiling from a source language to machine code, it compiles from JavaScript to better JavaScript. It parses your JavaScript, analyzes it, removes dead code and rewrites and minimizes what's left. It also checks syntax, variable references, and types, and warns about common JavaScript pitfalls.


    好吧,我们可以在JS文件本身的顶部包含所有的lint设置,而不是手动进行lint设置。

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

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

    声明所有的lint设置,如:

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

    希望这对你有帮助:)


    还有另一种积极开发的替代方案——JSC-javascript代码样式:

    JSCS is a code style linter for programmatically enforcing your style
    guide. You can configure JSCS for your project in detail using over
    150 validation rules, including presets from popular style guides like
    jQuery, Airbnb, Google, and more.

    它附带多个预设,您可以通过在.jscsrc配置文件中指定preset来选择,并自定义它-覆盖、启用或禁用任何规则:

    1
    2
    3
    4
    {
       "preset":"jquery",
       "requireCurlyBraces": null
    }

    还有为流行的编辑器构建的插件和扩展。

    还可以看到:

    • 完美的代码,零努力