版本

迁移到 v7.0.0

ESLint v7.0.0 是 ESLint 的一个主要版本。我们在此版本中进行了一些重大更改。本指南旨在引导您了解这些重大更改。

以下列表大致按每个更改预计影响的用户数量排序,其中第一个项目预计影响的用户最多。

目录

用户的重大更改

插件开发者的重大更改

集成开发者的重大更改


不再支持 Node.js 8

Node.js 8 在 2019 年 12 月达到 EOL,我们在此版本中正式放弃对其的支持。ESLint 现在支持以下版本的 Node.js

  • Node.js 10 (10.12.0 及以上)
  • Node.js 12 及以上

要解决: 确保在使用 ESLint v7.0.0 时升级到至少 Node.js 10.12.0。使用编辑器集成通过 ESLint 使用时,要仔细检查的一个重要事项是编辑器支持的 Node.js 版本。如果您无法升级,我们建议继续使用 ESLint 6,直到您可以升级 Node.js。

相关 issue: RFC44, #12700

默认情况下,lint 由 overrides[].files 匹配的文件

在 v7.0.0 之前的版本中,如果您提供像 eslint src 这样的目录,ESLint 默认只会 lint 扩展名为 .js 的文件。

ESLint v7.0.0 现在还会额外 lint 其他扩展名(.ts.vue 等)的文件,如果扩展名由 overrides[].files 条目显式匹配。这将允许用户 lint 不以 *.js 结尾的文件,而无需使用 --ext 命令行标志,并允许共享配置作者启用这些文件的 lint,而无需为最终用户增加额外的开销。请注意,以 * 结尾的模式不属于此行为,其行为将与之前相同。例如,如果存在以下配置文件,

# .eslintrc.yml
extends: my-config-js
overrides:
  - files: "*.ts"
    extends: my-config-ts

那么运行 eslint src 将检查 src 目录中的 *.js*.ts 文件。

要解决: 使用 --ext CLI 选项将覆盖此新行为。如果您正在使用 overrides 但只想 lint 扩展名为 .js 的文件,请使用 --ext .js 运行 ESLint。

如果您维护的插件检查扩展名不是 .js 的文件,此功能将允许您通过在 recommended 预设中配置 overrides 设置来默认检查这些文件。

相关 issue: RFC20, #12677

当使用 --config/--ignore-path 选项时,overridesignorePatterns 的基本路径已更改

到目前为止,ESLint 已经相对于入口配置文件的目录路径解析了以下路径

  • 配置文件 (.eslintrc.*)
    • overrides[].files 设置中的相对路径
    • overrides[].excludedFiles 设置中的相对路径
    • / 开头的 ignorePatterns 设置中的路径
  • 忽略文件 (.eslintignore)
    • / 开头的路径

从 ESLint v7.0.0 开始,分别使用 --config path/to/a-config--ignore-path path/to/a-ignore CLI 标志传递给 ESLint 的配置文件和忽略文件,将从当前工作目录而不是文件位置解析。这允许用户利用共享插件,而无需直接在他们的项目中安装它们。

要解决: 如果您通过 --config--ignore-path CLI 选项使用配置文件或忽略文件,请更新受影响的路径。

相关 issue: RFC37, #12887

插件解析已更新

在以前的版本中,ESLint 默认从当前工作目录解析所有插件。

从 ESLint v7.0.0 开始,plugins 相对于入口配置文件的目录路径解析。

这在大多数情况下不会改变任何内容。如果子目录中的配置文件定义了 plugins,则插件将从子目录(或包含当前工作目录的祖先目录,如果未找到)加载。

这意味着,如果您通过 --config 选项使用共享位置的配置文件,则配置文件声明的插件将从共享配置文件位置加载。

要解决: 确保插件安装在可以相对于您的配置文件解析的位置,或使用 --resolve-plugins-relative-to . 来覆盖此更改。

相关 issue: RFC47, #12922

~/.eslintrc.* 配置文件的运行时弃用警告

个人配置文件自 v6.7.0 以来已被弃用。ESLint v7.0.0 将开始打印运行时弃用警告。它将在以下情况下打印警告

  1. 当项目没有配置文件并且 ESLint 从 ~/.eslintrc.* 加载配置时。
  2. 当项目有一个配置文件并且 ESLint 忽略了 ~/.eslintrc.* 配置文件时。当 $HOME 目录是项目的祖先目录并且项目的配置文件不包含 root:true 时,会发生这种情况。

要解决: 删除 ~/.eslintrc.* 配置文件,并将 .eslintrc.* 配置文件添加到您的项目。或者,使用 --config 选项来使用共享配置文件。

相关 issue: RFC32, #12678

默认忽略模式已更改

到目前为止,ESLint 默认忽略以下文件

  • 点文件 (.*)
  • 当前工作目录中的 node_modules (/node_modules/*)
  • 当前工作目录中的 bower_components (/bower_components/*)

ESLint v7.0.0 也忽略子目录的 node_modules/*,但不再忽略 bower_components/*.eslintrc.js。因此,新的默认忽略模式是

  • 点文件,但 .eslintrc.* 除外 (.* 但不包括 .eslintrc.*)
  • node_modules (/**/node_modules/*)

要解决: 如果您不想 lint bower_components/*.eslintrc.js,请修改您的 .eslintignore 或配置文件的 ignorePatterns 属性。

相关 issue: RFC51, #12888

指令注释中的描述

在旧版本的 ESLint 中,没有方便的方法来指示为什么指令注释(例如 /*eslint-disable*/)是必要的。

为了允许提供上下文的注释与指令并置,ESLint v7.0.0 添加了在指令注释中附加任意文本的功能,方法是忽略以空格包围的 -- 后面的文本。例如

// eslint-disable-next-line a-rule, another-rule -- those are buggy!!

要解决: 如果您的指令注释中有以空格包围的 --,请考虑将其移动到您的配置文件中。

相关 issue: RFC33, #12699

Node.js/CommonJS 规则已被弃用

核心中的十个 Node.js/CommonJS 规则已被弃用,并已移动到 eslint-plugin-node 插件(对于 ESLint v8.0.0 及更高版本,请使用维护的 eslint-plugin-n 分支)。

要解决: 根据 我们的弃用政策,弃用的规则将在核心中保留可预见的未来,并且仍然可用。但是,我们将不再更新或修复这些规则中的任何错误。要使用受支持的规则版本,我们建议改用插件中的相应规则。

已弃用的规则 替换
callback-return node/callback-return
global-require node/global-require
handle-callback-err node/handle-callback-err
no-mixed-requires node/no-mixed-requires
no-new-require node/no-new-require
no-path-concat node/no-path-concat
no-process-env node/no-process-env
no-process-exit node/no-process-exit
no-restricted-modules node/no-restricted-require
no-sync node/no-sync

相关 issue: #12898

一些规则已更新以涵盖更多情况

一些规则已得到增强,现在报告更多错误

要解决: 修复错误或禁用这些规则。

相关 issue: #12490, #12608, #12670, #12701, #12765, #12837, #12913, #12915, #12919

eslint:recommended 已更新

eslint:recommended 预设中启用了三个新规则。

要解决: 修复错误或禁用这些规则。

相关 issue: #12920

RuleTester 类添加了额外的验证

RuleTester 现在验证以下内容

  • 如果被测规则使用非标准的 node.startnode.end 属性,则测试用例将失败。规则应改用 node.range
  • 如果被测规则提供自动修复,但测试用例没有 output 属性,则测试用例将失败。向测试用例添加 output 属性以测试规则的自动修复功能。
  • 如果在 errors 属性的对象中发现任何未知属性,则测试用例将失败。

要解决: 如果现有测试用例失败,请修改您的规则或测试用例。

相关 issue: RFC25, #12096, #12955

CLIEngine 类已被弃用

CLIEngine 已被弃用,并由新的 ESLint 替换。

CLIEngine 类提供了一个同步 API,它阻止了诸如并行 lint、支持共享配置/解析器/插件/格式化器中的 ES 模块以及添加可视化显示 lint 运行进度的功能的实现。新的 ESLint 类提供了一个异步 API,ESLint 核心现在将继续使用它。CLIEngine 将在核心中保留可预见的未来,但可能会在未来的主要版本中删除。

要解决: 如果您当前正在使用 CLIEngine,请更新您的代码以使用新的 ESLint 类。下表将现有的 CLIEngine 方法映射到它们的 ESLint 对等方法

CLIEngine ESLint
executeOnFiles(patterns) lintFiles(patterns)
executeOnText(text, filePath, warnIgnored) lintText(text, options)
getFormatter(name) loadFormatter(name)
getConfigForFile(filePath) calculateConfigForFile(filePath)
isPathIgnored(filePath) isPathIgnored(filePath)
static outputFixes(results) static outputFixes(results)
static getErrorResults(results) static getErrorResults(results)
static getFormatter(name) (已移除 ※1)
addPlugin(pluginId, definition) plugins 构造函数选项
getRules() (尚未实现)
resolveFileGlobPatterns() (已移除 ※2)
  • ※1 engine.getFormatter() 方法目前按原样返回已加载包的对象,这使得出于向后兼容性原因难以向格式化程序添加新功能。新的 eslint.loadFormatter() 方法返回一个适配器对象,该对象包装了已加载包的对象,以简化添加新功能的过程。此外,适配器对象可以访问 ESLint 实例以计算默认数据(例如,使用已加载的插件规则来生成 rulesMeta)。因此,ESLint 类仅实现 loadFormatter() 方法的实例版本。
  • ※2 自 ESLint 6 以来,ESLint 使用与 resolveFileGlobPatterns() 方法不同的逻辑来迭代文件,这使得此方法过时。

相关 issue: RFC40, #12939

更改语言