迁移到 v7.0.0
ESLint v7.0.0 是 ESLint 的一个主要版本。我们在此版本中进行了一些重大更改。本指南旨在引导您了解这些重大更改。
以下列表大致按每个更改预计影响的用户数量排序,其中第一个项目预计影响的用户最多。
目录
用户的重大更改
- 不再支持 Node.js 8
- 默认情况下,lint 由
overrides[].files
匹配的文件 - 如果配置文件由
--config
/--ignore-path
选项给出,则overrides
和ignorePatterns
的基本路径已更改 - ESLint 加载插件的位置已更改
~/.eslintrc.*
配置文件的运行时弃用警告- 默认忽略模式已更改
- 指令注释中的描述
- Node.js/CommonJS 规则已弃用
- 一些规则已更新以涵盖更多情况
eslint:recommended
已更新
插件开发者的重大更改
集成开发者的重大更改
不再支持 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。
默认情况下,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
设置来默认检查这些文件。
当使用 --config
/--ignore-path
选项时,overrides
和 ignorePatterns
的基本路径已更改
到目前为止,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 选项使用配置文件或忽略文件,请更新受影响的路径。
插件解析已更新
在以前的版本中,ESLint 默认从当前工作目录解析所有插件。
从 ESLint v7.0.0 开始,plugins
相对于入口配置文件的目录路径解析。
这在大多数情况下不会改变任何内容。如果子目录中的配置文件定义了 plugins
,则插件将从子目录(或包含当前工作目录的祖先目录,如果未找到)加载。
这意味着,如果您通过 --config
选项使用共享位置的配置文件,则配置文件声明的插件将从共享配置文件位置加载。
要解决: 确保插件安装在可以相对于您的配置文件解析的位置,或使用 --resolve-plugins-relative-to .
来覆盖此更改。
~/.eslintrc.*
配置文件的运行时弃用警告
个人配置文件自 v6.7.0 以来已被弃用。ESLint v7.0.0 将开始打印运行时弃用警告。它将在以下情况下打印警告
- 当项目没有配置文件并且 ESLint 从
~/.eslintrc.*
加载配置时。 - 当项目有一个配置文件并且 ESLint 忽略了
~/.eslintrc.*
配置文件时。当$HOME
目录是项目的祖先目录并且项目的配置文件不包含root:true
时,会发生这种情况。
要解决: 删除 ~/.eslintrc.*
配置文件,并将 .eslintrc.*
配置文件添加到您的项目。或者,使用 --config
选项来使用共享配置文件。
默认忽略模式已更改
到目前为止,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
属性。
指令注释中的描述
在旧版本的 ESLint 中,没有方便的方法来指示为什么指令注释(例如 /*eslint-disable*/
)是必要的。
为了允许提供上下文的注释与指令并置,ESLint v7.0.0 添加了在指令注释中附加任意文本的功能,方法是忽略以空格包围的 --
后面的文本。例如
// eslint-disable-next-line a-rule, another-rule -- those are buggy!!
要解决: 如果您的指令注释中有以空格包围的 --
,请考虑将其移动到您的配置文件中。
Node.js/CommonJS 规则已被弃用
核心中的十个 Node.js/CommonJS 规则已被弃用,并已移动到 eslint-plugin-node 插件(对于 ESLint v8.0.0 及更高版本,请使用维护的 eslint-plugin-n 分支)。
要解决: 根据 我们的弃用政策,弃用的规则将在核心中保留可预见的未来,并且仍然可用。但是,我们将不再更新或修复这些规则中的任何错误。要使用受支持的规则版本,我们建议改用插件中的相应规则。
相关 issue: #12898
一些规则已更新以涵盖更多情况
一些规则已得到增强,现在报告更多错误
- accessor-pairs 规则现在默认识别类成员。
- array-callback-return 规则现在识别
flatMap
方法。 - computed-property-spacing 规则现在默认识别类成员。
- func-names 规则现在识别默认导出中的函数声明。
- no-extra-parens 规则现在识别赋值目标中的括号。
- no-dupe-class-members 规则现在识别静态类成员的计算键。
- no-magic-numbers 规则现在识别 bigint 字面量。
- radix 规则现在识别
parseInt()
的第二个参数的无效数字。 - use-isnan 规则现在默认识别类成员。
- yoda 规则现在识别 bigint 字面量。
要解决: 修复错误或禁用这些规则。
相关 issue: #12490, #12608, #12670, #12701, #12765, #12837, #12913, #12915, #12919
eslint:recommended
已更新
eslint:recommended
预设中启用了三个新规则。
要解决: 修复错误或禁用这些规则。
相关 issue: #12920
为 RuleTester
类添加了额外的验证
RuleTester
现在验证以下内容
- 如果被测规则使用非标准的
node.start
或node.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()
方法不同的逻辑来迭代文件,这使得此方法过时。