ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误。ESLint 首先使用 AST 分析工具分析代码,然后使用插件配置生效的规则,针对预设的规则对代码进行检查,在不符合规则的时候提示&自动修复。你可以配置自己的代码检查规则,也可以根据已有的规则进行个性化的定制、扩展,甚至可以定制自己的规则。而在检查时,你也可以通过 js 注释在检查过程中灵活的开启、关闭和改变规则。
安装与使用
使用 npm 安装 ESLint:1
npm install eslint --save-dev
初始化配置文件1
npx eslint --init
运行 ESLint 进行代码检查1
2
3npx eslint yourfile.js
# 自动修复问题
npx eslint yourfile.js --fix
通常, ESLint 通过类似 .eslintrc.{js,yml,json}
的配置文件或者通过在 package.json
文件中添加 eslintConfig
键来对目录中的文件进行检查,这个文件可以通过执行 eslint --init
命令然后根据选择自动生成,生成后可以自由配置。
配置
以下介绍 .eslintrc.{js,yml,json}
配置文件中各字段含义:
env 环境
1 | // .eslintrc.json |
指定脚本的运行环境。每种环境都有一组特定的预定义全局变量。可以指定多个运行环境。在执行 eslint
命令时可以通过添加 --env
指定检查的环境。在代码中可以通过添加 /* eslint-env node, mocha */
指定特定的环境。
常用的环境包括:
env名 | 含义 |
---|---|
browser | 浏览器全局变量 |
node | Nodejs全局变量和Nodejs范围 |
commonjs | CommonJS全局变量和CommonJS范围(使用Browserify/webpack且仅运行在浏览器时使用) |
es6 | 打开所有 ECMAScript 6 功能除了 modules(自动设置 parserOptions.ecmaVersion 为6) |
es2021 | 添加所有 ECMAScript 2021 全局变量并自动将 parserOptions.ecmaVersion 设置为12 |
globals 全局变量
1 | // .eslintrc.json |
添加全局变量。 globals
下的 app
swan
代表了为 ESLint 添加的全局变量。在代码中可以通过添加 /* global app:writable, swan:writable */
指定添加全局环境变量。值 writeable
表示该全局变量可以被重写, readonly
表示不允许被重写, off
表示禁用该全局变量。
parser 解析器
指定 ESLint 使用的解析器。ESLint 默认使用 Espree 解析器。以下列出了ESLint支持的AST解析器
parser名 | 描述 |
---|---|
Esprima | jquery 团队提供的解析器,支持 ES9 ,符合 ESTree 标准语法树格式 |
Espree | ESLint 默认解析器,基于 Esprima 发展而来并兼容 Esprima,支持 ES6 |
@babel/eslint-parser | Babel 解析器的扩展,兼容 ESLint |
@typescript-eslint/parser | 支持 typescript 的 AST 解析器 |
parserOptions 解析器选项
1 | // .eslintrc.json |
通过 parserOptions
来选择支持特定的 JavaScript 版本和功能。ESLint 默认支持 ECMAScript5 语法。
以下是 parserOptions
的选项及其含义:
parserOptions选项 | 含义 |
---|---|
ecmaVersion | js 版本,默认5 |
sourceType | js 类型,默认 “script”,”module” 表示是 ECMAScript 包 |
ecmaFeatures | 表名额外支持的 js 功能,可取值 “globalReturn” 表示在全局范围允许 return ; “impliedStrict” 表示打开全局严格模式; “jsx” 表示支持 JSX |
plugins 插件
1 | // .eslintrc.json |
添加插件。 ESLint 支持添加插件来进行额外的处理。 plugins
是数组结构,包括了插件的名字,插件需要通过 npm install
来安装,在 plugins
配置中可以省略插件的前缀 eslint-plugin-
。
processor 处理器
1 | // .eslintrc.json |
插件可以包含处理器。处理器可以将其他类型的文件转换成 Javascript 代码,然后可以使用 ESLint 进行一些预处理。
overrides 重写
1 | // .eslintrc.json |
使用 overrides
可以对符合特定 glob 规则的文件进行特殊处理,包括执行特殊的规则或进行预处理。v4.1.0+版本支持。
rules 规则
1 | // .eslintrc.json |
指定脚本执行的规则。rules
下的 semi
quotes
代表了 ESLint 规则, plugin1/rule1
代表了插件 plugin1 下的 rule1 规则。 第一个值代表了规则的错误等级,取值有以下三个
rules key取值 | 数值 | 含义 |
---|---|---|
“off” | 0 | 将规则关闭 |
“warn” | 1 | 规则作为一个警告打开 |
“error” | 2 | 规则作为一个错误打开(不符合规则将会退出) |
第二个之后的值代表了规则的额外选项。
在代码中可以通过 /* eslint eqeqeq: "off", curly: 2, quotes: ["error", "double"] */
修改规则。可以通过 /* eslint-disable eqeqeq, curly*/
取消规则,通过 /* eslint-enable eqeqeq, curly*/
打开某个规则。
可以通过以下写法对单行代码禁用 ESLint 规则(所有或单条、多条):
1 | alert('foo'); // eslint-disable-line no-alert, plugin1/rule1 -- Here's a description about why this configuration is necessary. |
可以在ESLint代码规则后添加 --
来对该条规则进行解释,例如:
1 | /* eslint eqeqeq: "off", curly: "error" -- Here's a description about why this configuration is necessary. */ |
ESLint Rules 记录了所有的 ESLint 规则,你也可以 自定义自己的规则。
extends 继承
1 | // .eslintrc.json |
指定脚本执行的继承来源。 extends
表示你的规则继承自另一个配置,例如 eslint:recommended
代表所有 ESLint推荐规则(打✓的规则) 将会开启。extends
可以配置成一个字符串来表示 配置文件的路径、可共享配置的名称、 eslint:recommended
或 eslint:all
,也可以配置成字符串数组来表示每个配置继承它前面的配置。
一些常用的继承配置包括:
extends名 | 包 | 介绍 | 特点 |
---|---|---|---|
eslint:recommended | - | 启用 ESLint 推荐规则 | |
eslint:all | - | 启用当前安装的 ESLint 中所有的核心规则(不推荐在产品中使用) | |
airbnb-base | eslint-config-airbnb-base | Airbnb推荐的代码风格 | Airbnb号称是“最合理的编写 JavaScript 代码的方式”规范,规范写得比较全面,几乎覆盖了JavaScript的每一项特性 |
airbnb | eslint-config-airbnb | Airbnb推荐的代码风格,包括ES6和React | |
standard | eslint-config-standard | Standard代码风格 | standard 号称是为了节省团队在代码风格上消耗的时间,规范十分简洁,0配置,提供了工具进行自动格式化,不支持修改。风格上使用两个空格缩进,使用单引号,不使用分号作为语句结束,不允许有多余的行末逗号 |
eslint-config-google | Google推荐的代码风格 | ||
react-app | eslint-config-react-app | Create React App 使用的代码风格 |
其他配置
配置名 | 值 | 含义 |
---|---|---|
noInlineConfig | true | 禁用所有的内联配置注释,在命令中添加 --no-inline-config 可以起到同样的效果 |
reportUnusedDisableDirectives | true | 报告未使用的 eslint-disable 注释,在命令中添加 --report-unused-disable-directives 可以起到同样的作用 |
root | true | 表示该配置文件为项目根配置文件,无需向上检索(ESLint 对文件进行检查时会将离要检测的文件最近的配置文件作为最高优先级,然后检索父目录的配置) |
检查优先级
ESLint 检查文件时的规则按照以下顺序执行
- 行内配置
/*eslint-disable*/
和/*eslint-enable*/
/*global*/
/*eslint*/
/*eslint-env*/
- 命令行选项(或 CLIEngine 等价物):
--global
--rule
--env
-c、--config
- 项目级配置:
- 与要检测的文件在同一目录下的
.eslintrc.*
或package.json
文件,优先级 .js > .yaml > .yml > .json > .eslintrc(弃用) > package.json - 继续在父级目录寻找
.eslintrc
或package.json
文件,直到根目录(包括根目录)或直到发现一个有"root": true
的配置。
- 与要检测的文件在同一目录下的
- 如果不是 1 到 3 中的任何一种情况,退回到
~/.eslintrc
中自定义的默认配置。
忽略检查
可以通过在项目根目录创建一个 .eslintignore 文件告诉 ESLint 去忽略特定的文件和目录。.eslintignore 文件是一个纯文本文件,其中的每一行都是一个 glob 模式表明哪些路径应该忽略检测。 也可以在命令中添加参数 --ignore-pattern
来忽略指定文件、目录。除了 .eslintignore 文件中的模式,ESLint总是忽略 /node_modules/*
和 /bower_components/*
中的文件。除了使用 .eslintignore 文件,也可以在命令中添加参数 --ignore-path
来指定一个包含所有忽略文件的文本文件。如果没有发现 .eslintignore 文件,也没有指定替代文件,ESLint 将会在 package.json 中寻找 eslintIgnore
键,来检查要忽略的文件。
ESLint 命令
ESLint 除了可以安装到本地,也可以全局安装。ESLint 安装后可以直接执行 eslint -h
命令查看所有可选项
1 | npm i -g eslint |