版本

迁移到 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。

相关问题: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 设置来默认检查这些文件。

相关问题: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 选项使用配置或忽略文件,请更新受影响的路径。

相关问题:RFC37#12887

插件解析已更新

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

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

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

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

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

相关问题:RFC47#12922

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

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

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

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

相关问题: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/*)

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

相关问题:RFC51#12888

指令注释中的描述

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

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

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

解决方案:如果您在指令注释中使用空格包围的 --,请考虑将其移动到您的配置文件中。

相关问题: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

相关问题:#12898

多个规则已更新以涵盖更多情况

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

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

相关问题:#12490#12608#12670#12701#12765#12837#12913#12915#12919

eslint:recommended 已更新

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

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

相关问题:#12920

RuleTester 类中添加了额外的验证

RuleTester 现在验证以下内容:

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

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

相关问题: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() 方法不同的逻辑来迭代文件,这使得此方法变得过时。

相关问题:RFC40#12939

更改语言