Eslint详解——前世今生及使用教程

前言:当刚拿到Eslint的时候,我是一头雾水的。它是什么?与JsLint、JsHint、JSCS有什么区别?怎么用?是否能应用到我们的项目上?本文希望能解答你以上的困惑。废话不多说,让我们抓紧开始吧。

1 起源

JS是一门强大的语言,但是它也有很多不良的特性。这些特性会导致你的代码出现一些不可预期的错误。另外,当一个项目中有了多位开发人员之后,整个项目变得难看了起来—— A习惯于用分号结尾,而B沉迷于直接使用换行符;糟糕的是,这种情况还有很多。整个项目的风格迥异,给阅读和维护都带来了一定的困难。

JsLint:

为了解决这个问题,2010年7月,Douglas Crockford编写了JsLint。他最初的想法用一些既定的规则分析我们的JavaScript代码,把潜在的Bug和不良代码全部找出来。而Lint是最著名的C语言编译工具,它比其他编译工具更加严密,提供更加广泛的错误分析,这就是Douglas将这个工具命名为JsLint的原因。后来大家发现使用这个工具之后,编写出来的代码更像是一个人书写的代码,增加了代码的可维护性,这就是后话了。

JsHint:

但是Douglas是一个纯粹的处女座,他将认为的非Good Parts的部分都报了warning,而且在它的文档中也提到了你应该欣然接受所有的JSLint的建议。而且他的绝大部分规则都不能被改变。所以很多人在这种规则下备受压迫。Anton Kovalyov站了出来,开发了JsHint。相比于前者,JsHint有以下优点:

  • 支持参数可配置
  • 支持一些配置文件
  • 支持一些常用类库
  • 支持基本的ES6

EsLint:

Nicholas

终于不用生活在Douglas的阴影下了,普天同庆,程序员们留下了激动的泪水。但是很快大家又有了新的需求:

  • JsHint不支持自定义规则
  • JsHint不能根据错误定位到具体的规则

于是,Nicholas C. Zakas在2013年开始开发了Eslint,使开发者能自定义自己的linting rules,而且它提供了一套相当完善的插件机制,可以自由的扩展,动态加载配置规则,同时可以方便的根据报错定位到具体的规则配置。而且可以支持JSX(当前唯一一个)。

JSCS:

JSCS和上面的三种略有区别。它不会做任何事除非你赋给他一个配置。另外它更多的是一个code style的规范,而不会对可能隐藏的bug进行报告,例如没有使用的变量,或者是错误定义的全局变量。另外它在这四个里面是最慢的。

综上而言: 无脑选择Eslint就可以了,它灵活,全面可以自定义并且可以监测一些可能会出现的Bug。

2 使用

光说不练假把式,下面就罗列一下Eslint的使用方法。

和jsHint直接把规则写好了,只需要安装插件就能用不同,eslint需要在装好插件之外,额外添加自己的或者别人写好的规则。

eslint是非常灵活的,它允许你打开和关闭任意一条规则,来拼装最适合你的。有三种配置eslint的主要方法:

  • 使用JS注释的方法直接将配置信息嵌入到一个文件中

    /* eslint no-comma-dangle:1 */
    // Make this just a warning, not an error
    var obj = { key: 'value', }  
    
  • 将配置信息写在.eslintrc文件中(支持json和YAML)

    {
        "env": {
            "browser": true,
        },
        "globals": {
            "angular": true,
        },
        "rules": {
            "accessor-pairs": [2, { "getWithoutSet": true }],
            "array-callback-return": 1,
            "block-scoped-var": 2,
            "complexity": 0,
            ...
        }
    }
    
  • 将配置信息写在package.json中eslintConfig块中

    {
      "name": "mypackage",
      "version": "0.0.1",
      "eslintConfig": {
        "env": {
          "browser": true,
          "node": true
        }
      }
    }
    

像CSS的优先级一样,若子目录下有相应的配置,则会覆盖根目录下的配置。

eslint的具体配置内容文档可以参考《eslint中文文档》。当然,也可以选择别的大机构/公司已经写好的配置——例如安装airbnb和facebook的插件。

results matching ""

    No results matching ""