迁移到 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/*
)
解决方案:如果您不想检查 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 分支)。
解决方案:根据 我们的弃用策略,已弃用的规则将在可预见的未来保留在核心代码中,并且仍然可以使用。但是,我们不再更新或修复这些规则中的任何错误。要使用规则的支持版本,我们建议改用插件中的相应规则。
相关问题:#12898
多个规则已更新以涵盖更多情况
一些规则得到了增强,现在会报告更多错误。
- accessor-pairs 规则现在默认识别类成员。
- array-callback-return 规则现在识别
flatMap
方法。 - computed-property-spacing 规则现在默认识别类成员。
- func-names 规则现在识别默认导出中的函数声明。
- no-extra-parens 规则现在识别赋值目标中的括号。
- no-dupe-class-members 规则现在识别静态类成员的计算键。
- no-magic-numbers 规则现在识别大整数字面量。
- radix 规则现在识别
parseInt()
的第二个参数中的无效数字。 - use-isnan 规则现在默认识别类成员。
- yoda 规则现在识别大整数字面量。
解决方案:修复错误或禁用这些规则。
相关问题:#12490,#12608,#12670,#12701,#12765,#12837,#12913,#12915,#12919
eslint:recommended
已更新
eslint:recommended
预设启用了三个新规则。
解决方案:修复错误或禁用这些规则。
相关问题:#12920
RuleTester
类中添加了额外的验证
RuleTester
现在验证以下内容:
- 如果被测规则使用非标准的
node.start
或node.end
属性,则测试用例将失败。规则应改用node.range
。 - 如果被测规则提供了自动修复,但测试用例没有
output
属性,则测试用例将失败。向测试用例添加output
属性以测试规则的自动修复功能。 - 如果在
errors
属性中的对象中发现任何未知属性,则测试用例将失败。
解决方案:如果现有测试用例失败,请修改您的规则或测试用例。
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()
方法不同的逻辑来迭代文件,这使得此方法变得过时。