版本

配置文件 (已弃用)

您可以将您的 ESLint 项目配置放在一个配置文件中。您可以包含内置规则、您希望如何强制执行它们、带有自定义规则的插件、可共享的配置、您希望规则应用于哪些文件等等。

配置文件格式

ESLint 支持多种格式的配置文件

  • JavaScript - 使用 .eslintrc.js 并导出一个包含您的配置的对象。
  • JavaScript (ESM) - 当在 JavaScript 包中运行 ESLint 并在其 package.json 中指定 "type":"module" 时,使用 .eslintrc.cjs。 请注意,ESLint 目前不支持 ESM 配置。
  • YAML - 使用 .eslintrc.yaml.eslintrc.yml 来定义配置结构。
  • JSON - 使用 .eslintrc.json 来定义配置结构。ESLint 的 JSON 文件也允许 JavaScript 风格的注释。
  • package.json - 在您的 package.json 文件中创建一个 eslintConfig 属性,并在那里定义您的配置。

如果同一个目录中有多个配置文件,ESLint 只使用一个。优先级顺序如下

  1. .eslintrc.js
  2. .eslintrc.cjs
  3. .eslintrc.yaml
  4. .eslintrc.yml
  5. .eslintrc.json
  6. package.json

使用配置文件

有两种方法可以使用配置文件。

第一种使用配置文件的方法是通过 .eslintrc.*package.json 文件。ESLint 会自动在要 lint 的文件的目录中查找它们,并在连续的父目录中一直向上搜索到文件系统的根目录 (/)、当前用户的主目录 (~/),或者当指定 root: true 时。有关此内容的更多详细信息,请参阅下面的级联和层级。当您想要为项目的不同部分使用不同的配置,或者当您希望其他人能够直接使用 ESLint 而无需记住传入配置文件时,配置文件会很有用。

第二种使用配置文件的方法是将文件保存在您希望的任何位置,并使用 --config 选项将其位置传递给 CLI,例如

eslint -c myconfig.json myfiletotest.js

如果您正在使用一个配置文件并希望 ESLint 忽略任何 .eslintrc.* 文件,请确保将 --no-eslintrc--config 标志一起使用。

这是一个 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

配置级联基于要 lint 的文件的位置工作。如果要 lint 的文件的目录中存在 .eslintrc 文件,则该配置优先。然后,ESLint 会向上搜索目录结构,合并沿途找到的任何 .eslintrc 文件,直到到达带有 root: true.eslintrc 文件或根目录。

同样,如果在根目录中存在带有 eslintConfig 字段的 package.json 文件,则它描述的配置将应用于其下的所有子目录。但是,tests/ 目录中 .eslintrc 文件描述的配置会覆盖冲突的规范。

your-project
├── package.json
├── lib
│ └── source.js
└─┬ tests
  ├── .eslintrc.json
  └── test.js

如果在同一目录中找到 .eslintrcpackage.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

完整的配置层级结构,从最高优先级到最低优先级,如下所示

  1. 内联配置
    1. /*eslint-disable*//*eslint-enable*/
    2. /*global*/
    3. /*eslint*/
    4. /*eslint-env*/
  2. 命令行选项(或 CLIEngine 等效项)
    1. --global
    2. --rule
    3. --env
    4. -c, --config
  3. 项目级配置
    1. 与要 lint 的文件在同一目录中的 .eslintrc.*package.json 文件
    2. 继续在祖先目录中搜索 .eslintrc.*package.json 文件,直到包括根目录,或者直到找到带有 "root": true 的配置。

请注意,您首选操作系统上的当前用户的主目录 (~/) 在此上下文中也被视为根目录,并且在那里也会停止搜索配置文件。并且随着从 8.0.0 版本向前移除对个人配置文件的支持,该目录中存在的配置文件将被忽略。

扩展配置文件

配置文件一旦扩展,就可以继承另一个配置文件的所有特征(包括规则、插件和语言选项)并修改所有选项。因此,有三个配置,定义如下

  • 基础配置:被扩展的配置。
  • 派生配置:扩展基础配置的配置。
  • 最终实际配置:将派生配置合并到基础配置的结果。

extends 属性值可以是

  • 一个字符串,用于指定配置(配置文件的路径、可共享配置的名称、eslint:recommendedeslint: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 }],其中 skipBlankLinesskipComments 默认为 false

使用可共享的配置包

可共享配置是一个 npm 包,它导出一个配置对象。确保您已在项目根目录中安装该包,以便 ESLint 可以 require 它。

extends 属性值可以省略包名称的 eslint-config- 前缀。

npm init @eslint/config 命令可以创建一个配置,以便您可以扩展流行的风格指南(例如,eslint-config-standard)。

YAML 格式的配置文件的示例

extends: standard
rules:
  comma-dangle:
    - error
    - always
  no-empty: warn

使用 eslint:recommended

extends 属性中使用 "eslint:recommended" 可以启用报告常见问题的核心规则的子集(这些规则在规则页面上用复选标记(推荐)标识)。

这是一个扩展 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 可以 require 它的目录中。

plugins 属性值可以省略包名称的 eslint-plugin- 前缀。

extends 属性值可以包含

  • 插件
  • 包名称(您可以从中省略前缀,例如,reacteslint-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:all,在您升级到较新的 ESLint 主要或次要版本后,请在使用命令行上的 --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",
    }
}

基于 Glob 模式的配置

v4.1.0+。有时,需要更精细控制的配置,例如,如果同一目录中文件的配置必须不同。在这种情况下,您可以在 overrides 键下提供配置,这些配置仅适用于与特定 glob 模式匹配的文件,使用与您在命令行上传递的格式相同的格式(例如,app/**/*.test.js)。

覆盖中的 Glob 模式使用 minimatch 语法

覆盖如何工作?

可以通过使用 overrides 键在配置中基于文件 glob 模式覆盖设置。以下是使用 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 模式覆盖的优先级高于同一配置文件中的常规配置。同一配置文件中的多个覆盖按顺序应用。也就是说,配置文件中的最后一个覆盖块始终具有最高的优先级。
  • glob 特定配置的工作方式与任何其他 ESLint 配置几乎相同。覆盖块可以包含在常规配置中有效的任何配置选项,但 rootignorePatterns 除外。
    • glob 特定配置可以具有 extends 设置,但扩展配置中的 root 属性将被忽略。扩展配置中的 ignorePatterns 属性仅用于 glob 特定配置匹配的文件。
    • 仅当父配置和子配置的 glob 模式都匹配时,才会应用嵌套的 overrides 设置。当扩展配置具有 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.jsapp/components/barSpec.js,但匹配 server/serverSpec.js。如果您在 project-root 文件夹中的 .eslintrc.json 文件中定义了相同的模式,它将匹配所有三个 *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 28RFC 32

~/ 指的是 您首选操作系统上的当前用户的主目录。此处提到的个人配置文件是 ~/.eslintrc.* 文件,目前它的处理方式与其他配置文件不同。

ESLint 如何查找个人配置文件?

如果 eslint 在项目中找不到任何配置文件,eslint 会加载 ~/.eslintrc.* 文件。

如果 eslint 在项目中找到配置文件,即使 ~/.eslintrc.* 文件位于项目目录的祖先目录中,eslint 也会忽略它。

个人配置文件如何表现?

~/.eslintrc.* 文件的行为类似于常规配置文件,但有一些例外

~/.eslintrc.* 文件从 ~/node_modules/ 加载可共享配置和自定义解析器 – 类似于 require() – 在用户的主目录中。请注意,它不会加载全局安装的包。

默认情况下,~/.eslintrc.* 文件从 $CWD/node_modules 加载插件,以便唯一标识插件。如果您想将插件与 ~/.eslintrc.* 文件一起使用,则必须在每个项目中本地安装插件。或者,您可以使用 --resolve-plugins-relative-to CLI 选项来更改 ESLint 加载插件的位置。

更改语言