ESLint 是一款開源的 JavaScript lint 工具,由 Nicholas C. Zakas 於2013 年建立。node
ESLint 官方文檔 About 頁面 分 About 和 Philosophy 兩個部分對 ESLint 作了介紹,簡潔明瞭,值得一讀。react
藉助 ESLint,可將 靜態代碼分析 和 問題代碼協助修復 集成到 編碼、提交 和 打包 過程當中,及早發現並協助修復代碼中:webpack
在項目開發中得到以下收益:git
# Local Installation
yarn add -D eslint
# Global Installation
yarn add -g eslint
複製代碼
注意es6
官方文檔:eslint.org/docs/user-g…github
# eslint [選項] [操做目標]
eslint [options] [file|dir|glob]*
複製代碼
注意web
當使用 glob
語法指定操做目標時,glob
模式會被 shell
解析,解析結果可能因 shell
不一樣而不一樣。若是想要使用 node
的 glob
語法,必須使用引號將 glob
模式串引發來(在 Windows 中必須使用雙引號)。示例:typescript
eslint "lib/**"
複製代碼
使用 ESLint 命令時,能夠經過 eslint -h
概覽命令選項,找到本身須要的選項,而後後去官方文檔 命令行接口部分 查看該選項的詳細描述。shell
有些選項可接收一組參數,這類選項支持兩種傳參方式(有一個選項例外:--ignore-pattern
不支持第二種方式):express
示例:
# 1.
eslint --ext .jsx --ext .js lib/
# 2.
eslint --ext .jsx,.js lib/
複製代碼
配置文件中包含的相對路徑和 glob 模式都是基於當前配置文件的路徑進行解析的。
JavaScript
、JSON
或 YAML
文件中定義配置信息。對於這種配置方式,配置信息能夠寫在單獨的 .eslintrc.*
文件中,或者寫在 package.json
文件的 eslintConfig
字段中。這種配置對配置文件所在目錄及其子目錄樹中的全部文件有效。JavaScript
- use .eslintrc.js
文件導出一個包含配置信息的對象。YAML
- 使用 .eslintrc.yaml
或 .eslintrc.yml
定義配置。JSON
- 使用 .eslintrc.json
定義配置信息,JSON 文件中支持 JavaScript 註釋。package.json
- 在 package.json
文件中增長一個 eslintConfig
字段,在該字段中定義配置信息。.eslintrc
- 已廢棄若是在同一個目錄中有多個配置文件,則它們中間只有一個是有效的,優先級以下:
.eslintrc.js
.eslintrc.yaml
.eslintrc.yml
.eslintrc.json
.eslintrc
package.json
在同一個項目中,能夠爲不一樣目錄指定不一樣的配置文件。
當 lint 一個文件時,ESLint :
root: true
配置參數的配置文件,最終獲得一個配置文件列表。ESLint 配置除了經過配置文件指定,還能夠經過註釋內嵌或命令行選項指定。Lint 一個文件所使用的最終配置是各類配置合併的結果,合併時各類配置的優先級以下:
註釋內嵌配置
/*eslint-disable*/
and /*eslint-enable*/
/*global*/
/*eslint*/
/*eslint-env*/
經過命令行選項指定的配置
--global
--rule
--env
-c
, --config
項目級配置文件
若是沒有找到項目級配置文件,而且沒有或沒有找到經過 --config
指定配置文件,則去用戶家目錄(~/
)下搜索配置文件。
若是上述配置均不存在,則 ESLint 拋出 noConfigError
。
parser
指定 ESLint 使用的語法分析器。ESLint 兼容的語法分析器有:Esprima、Babel-ESLint、@typescript-eslint/parser,ESLint 默認使用 Esprima。
parserOptions
指定語法分析器選項,默認使用的語法分析器支持以下幾個選項:ecmaVersion
、sourceType
、ecmaFeatures
。示例:
{
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
}
}
複製代碼
不一樣的語法分析器可能具備不一樣的選項。
env
指定執行環境,一個執行環境會預約義一組全局變量。示例:
使用註釋配置
/* eslint-env node, mocha */
複製代碼
使用配置文件:
{
"env": {
"browser": true,
"node": true
}
}
複製代碼
globals
使用未在當前文件中定義的全局變量時,會命中 no-undef
規則,經過 globals
配置指定的全局變量無視 no-undef
規則。示例:
使用註釋配置
/* global var1, var2 */
/* global var1:writable, var2:writable */
複製代碼
在配置文件中指定:
{
"globals": {
"var1": "writable",
"var2": "readonly"
}
}
複製代碼
plugins
插件是第三方定製的規則集合,plugins
參數用於指定第三方插件,插件名中的 eslint-plugin-
前綴能夠省略。示例:
{
"plugins": [
"plugin1",
"eslint-plugin-plugin2"
]
}
複製代碼
使用插件時必須安裝其 npm 包。
注意
rules
指定 ESLint 校驗規則。
全部規則獨立於其餘規則,可單獨配置。
ESLint 內置規則:eslint.org/docs/rules/
規則組成:規則名、錯誤級別、附加選項
規則配置模式:
規則名: [錯誤級別, 附加選項]
規則名: 錯誤級別
複製代碼
示例:
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "double"]
}
複製代碼
在上述示例中,"semi"
和 "quotes"
是規則名,"error"
是規則錯誤級別,"always"
和 "quotes"
分別是 semi
和 quotes
各自特有的附加選項。
ESLint 定義了三種錯誤級別:
"off"
或 0
- 關閉,不校驗該規則"warn"
或 1
- 警告,不影響 exit code"error"
或 2
- 錯誤,觸發該規則時 exit code 爲 1
關於規則的錯誤級別,在 ESLint 特性概覽 部分已有介紹。使用註釋配置
/* eslint eqeqeq: "off", curly: "error" */
// 若是規則有額外選項,能夠用數組字面量語法
/* eslint quotes: ["error", "double"], curly: 2 */
複製代碼
使用配置文件
{
"rules": {
"eqeqeq": "off",
"curly": "error",
"quotes": ["error", "double"]
}
}
複製代碼
可在文件中使用註釋配置禁用所有規則或指定規則:
塊級禁用
/* eslint-disable */
alert('foo');
/* eslint-enable */
/* eslint-disable no-alert, no-console */
alert('foo');
console.log('bar');
/* eslint-enable no-alert, no-console */
複製代碼
文件級禁用
/* eslint-disable */
alert('foo');
/* eslint-disable no-alert */
alert('foo');
複製代碼
在指定行中禁用
alert('foo'); // eslint-disable-line
alert('foo'); // eslint-disable-line no-alert
alert('foo'); // eslint-disable-line no-alert, quotes, semi
alert('foo'); /* eslint-disable-line */
alert('foo'); /* eslint-disable-line no-alert */
alert('foo'); /* eslint-disable-line no-alert, quotes, semi */
// eslint-disable-next-line
// eslint-disable-next-line no-alert
// eslint-disable-next-line no-alert, quotes, semi
/* eslint-disable-next-line */
/* eslint-disable-next-line no-alert */
/* eslint-disable-next-line no-alert, quotes, semi */
alert('foo');
複製代碼
overrides
示例:
{
"rules": {...},
"overrides": [
{
"files": ["*-test.js","*.spec.js"],
"excludedFiles": "*.test.js",
"rules": {
"no-unused-expressions": "off"
}
}
]
}
複製代碼
對於匹配 overrides.files
且不匹配 overrides.excludedFiles
的 文件,overrides.rules
中的規則會覆蓋 rules
中的同名規則。
settings
指定一個對象,這個對象會被提供給每個將要執行的規則。
root
ESLint 在目錄樹種搜索配置文件時,若遇到 root
參數爲 true
的配置文件,就會中止搜索,不然沿着目錄樹一直向父級目錄的方向搜索到系統根目錄爲止。
extends
配置文件能夠在已有配置的基礎上進行擴展,extends
用於指定基礎配置。該參數的值爲如下之一:
ESLint 支持遞歸擴展配置,因此基礎配置中也可包含 extends
參數。
當指定基礎配置時,rules
參數指定的規則可按以下幾種方式進行擴展:
"eqeqeq": ["error", "allow-null"]
"eqeqeq": "warn"
"eqeqeq": ["warn", "allow-null"]
"quotes": ["error", "single", "avoid-escape"]
"quotes": ["error", "single"]
"quotes": ["error", "single"]
使用 extends
指定的基礎配置來源能夠是:
eslint:recommended
,啓用 ESLint 內置規則集 的一個子集。
共享配置包,一類導出 ESLint 配置對象的 npm 包,好比 eslint-config-standard
、eslint-config-airbnb
等。共享配置包須要安裝才能使用,配置時可省略報名中的 eslint-config-
前綴。
示例:
{
"extends": ["airbnb"]
"rules": {
"no-set-state": "off"
}
}
複製代碼
插件導出的命名配置,其配置值由如下幾部分組成:
plugin:
react
)/
recommended
)示例:
{
"plugins": [
"react"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"rules": {
"no-set-state": "off"
}
}
複製代碼
配置文件,經過配置文件的絕對路徑或相對路徑指定。
示例:
{
"extends": [
"./node_modules/coding-standard/eslintDefaults.js",
"./node_modules/coding-standard/.eslintrc-es6",
"./node_modules/coding-standard/.eslintrc-jsx",
"./my-eslint-config.js"
],
"rules": {
"eqeqeq": "warn"
}
}
複製代碼
eslint:all
,啓動全部 ESLint 內置規則,不推薦。
忽略文件和目錄
使用 .eslintignore
文件指定要忽略的文件和目錄,忽略模式的指定使用 .gitignore
的 規範。
ESLint 默認忽略 /node_modules/*
和 /bower_components/*
。
示例:
# /node_modules/* and /bower_components/* in the project root are ignored by default
# Ignore built files except build/index.js
build/*
!build/index.js
複製代碼
eslint-config-airbnb 是一個 ESLint 共享配置包,支持 ECMAScript 6+ 和 React。
安裝 eslint-config-airbnb
# 安裝 eslint-config-airbnb
yarn add -D eslint-config-airbnb@latest
# 獲取 peerDependencies
npm info "eslint-config-airbnb@latest" peerDependencies
# 安裝 peerDependencies
yarn add -D <dependency_1>@<version> <dependency_2>@<version> ...
複製代碼
eslint-config-airbnb 依賴的插件
import
/ export
語法以及模塊路徑有效性的校驗。配置示例
// .eslintrc.js
module.exports = {
root: true,
extends: ['airbnb'],
parserOptions: {
// eslint-config-airbnb: { ecmaVersion: 6, sourceType: 'module' }
ecmaFeatures: {
// eslint-config-airbnb: { jsx: true, es6: true }
generators: true,
},
},
env: {
// eslint-config-airbnb: { node: true, es6: true }
browser: true,
},
rules: {
indent: ['error', 4],
},
}
複製代碼
若是開啓了 eslint-plugin-import no-unresolved
規則,能夠藉助該插件使用 webpack 的 resolve
配置解析模塊路徑。
安裝
yarn add -D eslint-import-resolver-webpack
複製代碼
配置方式:
{
"settings": {
"import/resolver": "webpack", // 使用 webpack 默認配置
}
}
複製代碼
{
"settings": {
"import/resolver": {
"webpack": {
"config": "webpack.dev.config.js" // 指定要使用的 webpack 配置文件
}
}
}
}
複製代碼
{
"settings": {
"import/resolver": {
"webpack": {
"config": { // 定義 webpack 配置對象
"resolve": {
"extensions": [".js", ".jsx"]
}
}
}
}
}
}
複製代碼
babel-eslint 是一款用於 ESLint 的語法分析器,它支持使用 ESLint 分析全部 babel 兼容的代碼。
使用 babel-eslint 須要安裝 babel 並提供 babel 配置文件。
ESLint 核心規則不支持實驗階段的語法,若是要使用這部分語法,須要配合 eslint-plugin-babel 使用。
安裝
# 安裝 babel-eslint
yarn add -D babel-eslint
# 安裝 eslint-plugin-babel
yarn add -D eslint-plugin-babel
複製代碼
配置
{
"parser": "babel-eslint",
"plugins": ["babel"]
}
複製代碼
使用:在 VSCode 設置中將 eslint.enable
設置爲 true
使用:在 VSCode 設置中將 prettier.eslintIntegration
設置爲 true
,prettier 插件執行格式化時將使用 prettier-eslint 完成下述操做:
eslint --fix
相比於直接使用 eslint --fix
命令,prettier 插件:
在提交代碼時,lint git 暫存區的代碼,若 lint 不經過則中斷提交,保證問題代碼不進入代碼倉庫。
工具:
配置示例:
package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"linters": {
"**/*.js": ["eslint --fix", "git add"]
},
"ignore": ["**/{dist,build}/**/*.js", "**/*.min.js"]
}
}
複製代碼
module.exports = {
root: true,
extends: ['airbnb'],
plugins: ['babel'],
parser: 'babel-eslint',
parserOptions: {
ecmaFeatures: {
generators: true,
},
},
env: {
browser: true,
},
rules: {
indent: ['error', 4],
},
settings: {
'import/resolver': {
// 識別 webpack 配置的路徑別名
webpack: {
config: 'webpack.config.js',
}
},
},
}
/** peerDependencies: { "babel-eslint": "^10.0.1", "eslint": "^5.15.0", "eslint-config-airbnb": "^17.1.0", "eslint-import-resolver-webpack": "^0.11.0", "eslint-plugin-babel": "^5.3.0", "eslint-plugin-import": "^2.14.0", "eslint-plugin-jsx-a11y": "^6.1.1", "eslint-plugin-react": "^7.11.0", } */
複製代碼