Appearance
配置文件
配置文件格式
ESLint 支持多种格式的配置文件:
- JavaScript - 使用
.eslintrc.js
和导出包含您的配置的对象。 - JavaScript (ESM) -
.eslintrc.cjs
在 JavaScript 包中运行 ESLint 时使用,这些包"type":"module"
在package.json
。请注意,ESLint 目前不支持 ESM 配置。 - YAML - 使用
.eslintrc.yaml
or.eslintrc.yml
来定义配置结构。 - JSON - 用于
.eslintrc.json
定义配置结构。ESLint 的 JSON 文件也允许 JavaScript 样式的注释。 - package.json - 在你的
package.json
文件中创建一个eslintConfig
属性,并在那里定义你的配置。
如果同一目录下有多个配置文件,ESLint 只会使用一个。优先顺序如下:
.eslintrc.js
.eslintrc.cjs
.eslintrc.yaml
.eslintrc.yml
.eslintrc.json
package.json
使用配置文件
有两种使用配置文件的方法。
第一种使用配置文件的方法是通过.eslintrc.*
和package.json
文件。ESLint 将自动在要检查的文件的目录中查找它们,并在连续的父目录中一直查找到文件系统的根目录 ( /
)、当前用户的主目录 ( ~/
) 或当root: true
被指定。有关这方面的更多详细信息,请参阅下面的 级联和层次结构。当您希望项目的不同部分有不同的配置或希望其他人能够直接使用 ESLint 而无需记住传递配置文件时,配置文件会很有用。
使用配置文件的第二种方法是将文件保存在您想要的任何位置,并使用--config
选项将其位置传递给 CLI,例如:
eslint -c myconfig.json myfiletotest.js
如果您正在使用一个配置文件并希望 ESLint 忽略任何.eslintrc.*
文件,请确保 --no-eslintrc
与 -c
标志一起使用。
下面是一个 JSON 配置文件示例,它使用 TypeScript -eslint 解析器来支持 TypeScript 语法:
{
"root": true,
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": { "project": ["./tsconfig.json"] },
"plugins": [
"@typescript-eslint"
],
"rules": {
"@typescript-eslint/strict-boolean-expressions": [
2,
{
"allowString" : false,
"allowNumber" : false
}
]
},
"ignorePatterns": ["src/**/*.test.ts", "src/frontend/generated/*"]
}
配置文件中的注释
JSON 和 YAML 配置文件格式都支持注释(package.json 文件不应包含它们)。您可以对 JSON 文件使用 JavaScript 样式的注释,对 YAML 文件使用 YAML 样式的注释。ESLint 安全地忽略配置文件中的注释。这使您的配置文件更加人性化。
对于 JavaScript 样式的注释:
{
"env": {
"browser": true
},
"rules": {
// Override our default settings just for this directory
"eqeqeq": "warn",
"strict": "off"
}
}
对于 YAML 样式的注释:
env:
browser: true
rules:
# Override default settings
eqeqeq: warn
strict: off
添加共享设置
ESLint 支持将共享设置添加到配置文件中。插件用于settings
指定应在其所有规则之间共享的信息。您可以将settings
对象添加到 ESLint 配置文件中,它将提供给正在执行的每个规则。如果您要添加自定义规则并希望它们能够访问相同的信息并且易于配置,这可能会很有用。
在 JSON 中:
{
"settings": {
"sharedData": "Hello"
}
}
在 YAML 中:
---
settings:
sharedData: "Hello"
级联和层次结构
使用.eslintrc.*
和package.json
文件进行配置时,您可以利用配置级联。假设您有以下结构:
your-project
├── .eslintrc.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.js
配置级联的工作基于被检查文件的位置。如果.eslintrc
在与被检查的文件相同的目录中有文件,则该配置优先。然后 ESLint 搜索目录结构,合并沿途找到的所有.eslintrc
文件,直到到达带有root: true
的.eslintrc
文件或根目录。
同理,如果package.json
根目录下有文件带eslintConfig
字段,则其描述的配置将适用于其下的所有子目录,但目录中.eslintrc
文件描述的配置tests/
会在规范冲突的地方覆盖它。
your-project
├── package.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.js
如果在同一目录下找到一个.eslintrc
和一个package.json
文件,.eslintrc
将优先,package.json
文件将不被使用。
默认情况下,ESLint 会在所有父文件夹中查找配置文件,直到根目录。如果您希望所有项目都遵循某种约定,这可能很有用,但有时会导致意想不到的结果。要将 ESLint 限制为特定项目,请将"root": true
放置在.eslintrc.*
文件或package.json
文件的eslintConfig
字段中,或者放在项目根级别的.eslintrc.*
文件中。ESLint 一旦找到配置文件,就会停止在父文件夹中查找"root": true
.
{
"root": true
}
在 YAML 中:
---
root: true
例如,下方projectA
的lib/
目录中的.eslintrc
文件中设置了"root": true
。在这种情况下,在 linting main.js
时,将使用lib/
中的配置,而不是projectA/
中的.eslintrc
文件。
home
└── user
└── projectA
├── .eslintrc.json <- Not used
└── lib
├── .eslintrc.json <- { "root": true }
└── main.js
完整的配置层次结构,从最高到最低优先级,如下所示:
- 内联配置:
/*eslint-disable*/
和/*eslint-enable*/
/*global*/
/*eslint*/
/*eslint-env*/
- 命令行选项(或 CLIEngine 等效项):
--global
--rule
--env
-c
,--config
- 项目级配置:
.eslintrc.*
或package.json
与 linted 文件位于同一目录中的文件- 继续在祖先目录中搜索
.eslintrc.*
和package.json
文件,包括根目录,或者找到"root": true
的配置。
请注意,您首选操作系统( ~/
) 上当前用户的主目录在此上下文中也被视为根目录,搜索配置文件也将停止在那里。并且随着从 8.0.0 版本开始 删除对个人配置文件的支持, 该目录中存在的配置文件将被忽略。
扩展配置文件
一个配置文件,一旦扩展,就可以继承另一个配置文件的所有特征(包括规则、插件和语言选项)并修改所有选项。因此,存在三种配置,定义如下:
- 基本配置:扩展的配置。
- 派生配置:扩展基本配置的配置。
- Resulting actual config:将派生配置合并到基础配置中的结果。
extends
属性值为:
- 指定配置的字符串(配置文件的路径,可共享配置的名称
eslint:recommended
,或eslint:all
) - 一个字符串数组,其中每个附加配置都扩展了前面的配置
ESLint 递归地扩展配置,所以基本配置也可以有一个extends
属性。属性中的相对路径和可共享的配置名称extends
是从它们出现的配置文件的位置解析的。
eslint-config-
可以从配置名称中省略前缀。例如,airbnb
解析为eslint-config-airbnb
.
该rules
属性可以执行以下任何操作来扩展(或覆盖)规则集:
- 启用附加规则
- 更改继承规则的严重性而不更改其选项:
- 基础配置:
"eqeqeq": ["error", "allow-null"]
- 派生配置:
"eqeqeq": "warn"
- 产生的实际配置:
"eqeqeq": ["warn", "allow-null"]
- 基础配置:
- 覆盖基本配置中的规则选项:
- 基础配置:
"quotes": ["error", "single", "avoid-escape"]
- 派生配置:
"quotes": ["error", "single"]
- 产生的实际配置:
"quotes": ["error", "single"]
- 基础配置:
- 覆盖基本配置中作为对象给出的规则的选项:
- 基础配置:
"max-lines": ["error", { "max": 200, "skipBlankLines": true, "skipComments": true }]
- 派生配置:
"max-lines": ["error", { "max": 100 }]
- 产生的实际配置:
"max-lines": ["error", { "max": 100 }]
whereskipBlankLines
和skipComments
default tofalse
- 基础配置:
使用可共享的配置包
可 共享的配置 是一个导出配置对象的 npm 包。确保你已经在你的项目根目录中安装了这个包,以便 ESLint 可以要求它。
extends
属性值可以省略包名的前缀eslint-config-
。
该npm init @eslint/config
命令可以创建配置,以便您可以扩展流行的样式指南(例如,eslint-config-standard
)。
YAML 格式的配置文件示例:
extends: standard
rules:
comma-dangle:
- error
- always
no-empty: warn
使用eslint:recommended
"eslint:recommended"
在属性中使用extends
可启用报告常见问题的核心规则子集(这些规则在 规则页面 上用复选标记(推荐)标识)。
eslint:recommended
这是扩展和覆盖某些设置配置选项的示例:
JavaScript 格式的配置文件示例:
module.exports = {
"extends": "eslint:recommended",
"rules": {
// enable additional rules
"indent": ["error", 4],
"linebreak-style": ["error", "unix"],
"quotes": ["error", "double"],
"semi": ["error", "always"],
// override configuration set by extending "eslint:recommended"
"no-empty": "warn",
"no-cond-assign": ["error", "always"],
// disable rules from base configurations
"for-direction": "off",
}
}
使用插件中的配置
插件 是一个 npm 包,可以为 ESLint 添加各种扩展。插件可以执行许多功能,包括但不限于添加新规则和导出 可共享配置。确保软件包已安装在 ESLint 可能需要它的目录中。
plugins
属性值 可以省略包名的前缀eslint-plugin-
。
extends
属性值可以包括:
plugin:
- 包名(可以省略前缀,例如,
react
是eslint-plugin-react
的缩写) /
- 配置名称(例如,
recommended
)
JSON 格式的配置文件示例:
{
"plugins": [
"react"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"rules": {
"react/no-set-state": "off"
}
}
使用配置文件
extends
属性值可以是基本 配置文件 的绝对或相对路径。ESLint 解析相对于使用它的配置文件的基本配置文件的相对路径。
JSON 格式的配置文件示例:
{
"extends": [
"./node_modules/coding-standard/eslintDefaults.js",
"./node_modules/coding-standard/.eslintrc-es6",
"./node_modules/coding-standard/.eslintrc-jsx"
],
"rules": {
"eqeqeq": "warn"
}
}
使用"eslint:all"
该extends
属性值可以是"eslint:all"
启用当前安装的 ESLint 版本中的所有核心规则。核心规则集可以在 ESLint 的任何次要或主要版本中更改。
重要提示:不建议将此配置用于生产环境,因为它会随着 ESLint 的每个次要和主要版本而变化。需要您自担风险使用它。
在决定项目配置时,您可以启用所有核心规则作为探索规则和选项的快捷方式,尤其是在您很少覆盖选项或禁用规则的情况下。规则的默认选项不是 ESLint 的背书(例如,quotes
规则的默认选项并不意味着双引号优于单引号)。
如果您的配置扩展,在您升级到 ESLint 的新主要或次要版本后,请在使用 命令行 选项eslint:all
之前查看报告的问题,以便了解新的可修复规则是否会对代码进行更改。--fix
JavaScript 格式的配置文件示例:
module.exports = {
"extends": "eslint:all",
"rules": {
// override default options
"comma-dangle": ["error", "always"],
"indent": ["error", 2],
"no-cond-assign": ["error", "always"],
// disable now, but enable in the future
"one-var": "off", // ["error", "never"]
// disable
"init-declarations": "off",
"no-console": "off",
"no-inline-comments": "off",
}
}
基于全局模式的配置
v4.1.0+。 有时需要更精细控制的配置,例如,如果同一目录中的文件的配置必须不同。因此,您可以在overrides
仅适用于与特定 glob 模式匹配的文件的键下提供配置,使用与在命令行中传递的相同格式(例如,app/**/*.test.js
)。
覆盖中的全局模式使用 minimatch 语法。
覆盖如何工作?
可以使用键覆盖基于配置中文件 glob 模式的设置overrides
。使用密钥的示例overrides
如下:
在你的.eslintrc.json
:
{
"rules": {
"quotes": ["error", "double"]
},
"overrides": [
{
"files": ["bin/*.js", "lib/*.js"],
"excludedFiles": "*.test.js",
"rules": {
"quotes": ["error", "single"]
}
}
]
}
以下是覆盖在配置文件中的工作方式:
这些模式应用于相对于配置文件目录的文件路径。例如,如果您的配置文件具有路径
/Users/john/workspace/any-project/.eslintrc.js
,而您要 lint 的文件具有路径/Users/john/workspace/any-project/lib/util.js
,那么中提供的模式.eslintrc.js
将针对相对路径执行lib/util.js
。全局模式覆盖的优先级高于同一配置文件中的常规配置。同一配置中的多个覆盖按顺序应用。也就是说,配置文件中的最后一个覆盖块始终具有最高优先级。
glob 特定配置的工作方式几乎与任何其他 ESLint 配置相同。覆盖块可以包含在常规配置中有效的任何配置选项,除了
root
and
ignorePatterns
。
- glob 特定配置可以有一个
extends
设置,但root
扩展配置中的属性被忽略。扩展配置中的ignorePatterns
属性仅用于 glob 特定配置匹配的文件。 overrides
仅当父配置和子配置的 glob 模式都匹配时,才会应用嵌套设置。当扩展配置有overrides
设置时也是如此。
- glob 特定配置可以有一个
可以在单个覆盖块中提供多个 glob 模式。文件必须至少匹配提供的模式之一才能应用配置。
覆盖块还可以指定要从匹配项中排除的模式。如果文件与任何排除的模式匹配,则配置将不适用。
相对全局模式
project-root
├── app
│ ├── lib
│ │ ├── foo.js
│ │ ├── fooSpec.js
│ ├── components
│ │ ├── bar.js
│ │ ├── barSpec.js
│ ├── .eslintrc.json
├── server
│ ├── server.js
│ ├── serverSpec.js
├── .eslintrc.json
中的配置app/.eslintrc.json
定义了 glob 模式**/*Spec.js
。此模式相对于app/.eslintrc.json
. 所以,这个模式会匹配app/lib/fooSpec.js
,app/components/barSpec.js
但不是 server/serverSpec.js
。如果您在文件夹中的.eslintrc.json
文件中定义了相同的模式project-root
,它将匹配所有三个*Spec
文件。
如果通过--config
CLI 选项提供配置,则配置中的 glob 模式相对于当前工作目录,而不是给定配置的基本目录。例如,如果--config configs/.eslintrc.json
存在,则配置中的 glob 模式是相对于.
而不是./configs
.
指定要 lint 的目标文件
如果您使用 CLI 指定了目录(例如,eslint lib
),ESLint 会搜索目录中的目标文件以进行 lint。目标文件是*.js
或匹配任何overrides
条目的文件(但排除任何以files
结尾的条目*
)。
如果您指定了 --ext
命令行选项和目录,则目标文件只是具有指定文件扩展名的文件,而与overrides
条目无关。
个人配置文件(已弃用)
⚠️此功能已弃用。此功能将在 8.0.0 版本中删除。如果您想继续使用个人配置文件,请使用 --config
CLI 选项。有关此决定的更多信息,请参阅 RFC 28 和 RFC 32。
~/
指 当前用户在首选操作系统上的主目录。此处所指的个人配置文件为~/.eslintrc.*
file,目前处理方式与其他配置文件不同。
ESLint 如何找到个人配置文件?
如果eslint
在项目中找不到任何配置文件,则eslint
加载~/.eslintrc.*
文件。
如果eslint
可以在项目中找到配置文件,则eslint
忽略~/.eslintrc.*
文件,即使它位于项目目录的祖先目录中。
个人配置文件的行为如何?
~/.eslintrc.*
文件的行为类似于常规配置文件,但有一些例外:
~/.eslintrc.*
文件从用户的主目录中加载可共享的配置和自定义解析器~/node_modules/
——与此类似。require()
请注意,它不会加载全局安装的软件包。
~/.eslintrc.*
文件$CWD/node_modules
默认从加载插件,以便唯一地识别插件。如果要对~/.eslintrc.*
文件使用插件,则必须在每个项目本地安装插件。或者,您可以使用 --resolve-plugins-relative-to
CLI 选项 更改 ESLint 加载插件的位置。