# 配置文件

# 配置文件的格式

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

  • JavaScript - 使用 .eslintrc.js 并导出包含您的配置的对象。
  • JavaScript (ESM) - 在 package.json 中指定 "type":"module" 的 JavaScript 包中运行 ESLint 时使用 .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 会自动在要检查的文件的目录中查找它们,并在连续的父目录中一直查找到文件系统的根目录(/)、当前用户的主目录(~/),或者当 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字段,它描述的配置会应用到它下面的所有子目录,但是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

例如,考虑在 lib/ 目录下的 .eslintrc 文件中设置了 "root": trueprojectA。在这种情况下,检查 main.js 时,会使用 lib/ 中的配置,但不会使用 projectA/ 中的 .eslintrc 文件。

home
└── user
    └── projectA
        ├── .eslintrc.json  <- Not used
        └── lib
            ├── .eslintrc.json  <- { "root": true }
            └── main.js

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

  1. 内联配置
    • /eslint-disable/ 和 /eslint-enable/
    • /global/
    • /eslint/
    • /eslint-env/
  2. 命令行选项(或 CLIEngine 等效项):
    • --global
    • --rule
    • --env
    • -c、--config
  3. 项目级配置:
    • 与检查的文件位于同一目录中的 .eslintrc.* 或 package.json 文件
    • 继续在祖先目录中搜索 .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 }],其中 skipBlankLines 和 skipComments 默认为 false

# 使用可共享的配置包

可共享配置 是一个导出配置对象的 npm 包。确保你已经在你的项目根目录中安装了这个包,以便 ESLint 可以要求它。

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

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

YAML 格式的配置文件示例:

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

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 可能需要它的目录中。

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

extends 属性值可以包括:

  • plugin:
  • 包名(可以省略前缀,例如,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",
    }
}

# 基于通配符模式的配置

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

覆盖中的通配符模式使用 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,而您要检查的文件具有路径 /Users/john/workspace/any-project/lib/util.js,那么 .eslintrc.js 中提供的模式将针对相对路径 lib/util.js 执行。

  • 通配符模式覆盖的优先级高于同一配置文件中的常规配置。同一配置中的多个覆盖按顺序应用。也就是说,配置文件中的最后一个覆盖块始终具有最高优先级。

  • glob 特定配置的工作方式几乎与任何其他 ESLint 配置相同。覆盖块可以包含在常规配置中有效的任何配置选项,rootignorePatterns 除外。glob 特定配置可以具有 extends 设置,但扩展配置中的 root 属性将被忽略。扩展配置中的 ignorePatterns 属性仅用于 glob 特定配置匹配的文件。 仅当父配置和子配置的 glob 模式匹配时,才会应用嵌套 overrides 设置。当扩展配置具有 overrides 设置时也是如此。

  • 可以在单个覆盖块中提供多个 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 中的配置定义了通配符模式 **/*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

# 指定要检查的目标文件

如果您使用 CLI 指定了目录(例如,eslint lib),ESLint 会搜索目录中的目标文件以进行检查。目标文件是 *.js 或与任何 overrides 条目匹配的文件(但不包括任何以 * 结尾的 files 条目)。

如果与目录一起指定了 --ext 命令行选项,则目标文件只是具有指定文件扩展名的文件,而与 overrides 条目无关。

# 个人配置文件(已弃用)

⚠️ 此功能已被弃用。此功能将在 8.0.0 版本中删除。如果您想继续使用个人配置文件,请使用--config CLI 选项。有关此决定的更多信息,请参阅 RFC 28RFC 32

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

# ESLint 如何找到个人配置文件?

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

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

# 个人配置文件的行为如何?

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

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

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

Last Updated: 6/14/2023, 8:56:23 AM