迁移到 v8.0.0
ESLint v8.0.0 是 ESLint 的一个主要版本。我们在本次发布中做了一些重大更改。本指南旨在引导您了解这些重大更改。
以下列表大致按预计每个更改影响的用户数量排序,其中第一个条目预计影响的用户最多。
目录
用户的重大更改
- 不再支持 Node.js 10、13 和 15
- 移除了
codeframe
和table
格式化程序 comma-dangle
规则模式更严格- 未使用的禁用指令现在可以修复
eslint:recommended
已更新
插件开发者的重大更改
- 不再支持 Node.js 10、13 和 15
- 规则需要
meta.hasSuggestions
来提供建议 - 规则需要
meta.fixable
来提供修复 SourceCode#getComments()
在RuleTester
中失败- 速记属性 AST 格式的更改
集成开发者的重大更改
不再支持 Node.js 10、13 和 15
Node.js 10、13、15 都在 2020 年或 2021 年初达到了生命周期终点。从 ESLint v8.0.0 开始,ESLint 官方放弃对这些 Node.js 版本的支持。ESLint 现在支持以下 Node.js 版本
- Node.js 12.22 及以上
- Node.js 14 及以上
- Node.js 16 及以上
要解决: 当使用 ESLint v8.0.0 时,请确保您升级到至少 Node.js 12.22.0
。一个需要重点检查的事情是当通过编辑器集成使用 ESLint 时,您的编辑器支持的 Node.js 版本。如果您无法升级,我们建议您继续使用 ESLint 7,直到您可以升级 Node.js。
相关问题: #14023
移除了 codeframe
和 table
格式化程序
ESLint v8.0.0 已经从核心中移除了 codeframe
和 table
格式化程序。这些格式化程序需要的依赖项在 ESLint 的其他地方没有使用,移除它们可以减小 ESLint 的体积,从而加快安装速度。
要解决: 如果您正在使用 codeframe
或 table
格式化程序,您需要安装独立的 eslint-formatter-codeframe
或 eslint-formatter-table
包,才能在 ESLint v8.0.0 中使用它们。
comma-dangle
规则模式更严格
在 ESLint v7.0.0 中,comma-dangle
规则可以像这样配置而不会出错
{
"rules": {
"comma-dangle": ["error", "never", { "arrays": "always" }]
}
}
使用此配置,规则会忽略数组中的第三个元素,因为只读取第二个元素。在 ESLint v8.0.0 中,此配置将导致 ESLint 抛出错误。
要解决: 更改您的规则配置,使数组中只有两个元素,并且第二个元素是字符串或对象,例如
{
"comma-dangle": ["error", "never"],
}
或
{
"comma-dangle": ["error", {
"arrays": "never",
"objects": "never",
"imports": "never",
"exports": "never",
"functions": "never"
}]
}
相关问题: #13739
未使用的禁用指令现在可以修复
在 ESLint v7.0.0 中,在命令行上同时使用 --report-unused-disable-directives
和 --fix
将仅修复规则,但保留未使用的禁用指令。在 ESLint v8.0.0 中,命令行选项的这种组合将导致未使用的禁用指令被移除。
要解决: 如果您在命令行上一起使用 --report-unused-disable-directives
和 --fix
,并且您不希望移除未使用的禁用指令,请添加 --fix-type problem,suggestion,layout
作为命令行选项。
相关问题: #11815
eslint:recommended
已更新
在 eslint:recommended
预设中启用了四个新规则。
no-loss-of-precision
no-nonoctal-decimal-escape
no-unsafe-optional-chaining
no-useless-backreference
要解决: 修复错误或禁用这些规则。
相关问题: #14673
规则需要 meta.hasSuggestions
来提供建议
在 ESLint v7.0.0 中,提供建议的规则不需要告知 ESLint。在 v8.0.0 中,提供建议的规则需要将其 meta.hasSuggestions
设置为 true
。这会告知 ESLint 该规则打算提供建议。如果没有此属性,任何提供建议的尝试都将导致错误。
要解决: 如果您的规则提供建议,请将 meta.hasSuggestions
添加到对象,例如
module.exports = {
meta: {
hasSuggestions: true
},
create(context) {
// your rule
}
};
eslint-plugin/require-meta-has-suggestions 规则可以自动修复并强制您的规则正确指定 meta.hasSuggestions
。
相关问题: #14312
规则需要 meta.fixable
来提供修复
在 ESLint v7.0.0 中,作为函数(而不是对象)编写的规则能够提供修复。在 ESLint v8.0.0 中,只有作为对象编写的规则才允许提供修复,并且必须将 meta.fixable
属性设置为 "code"
或 "whitespace"
。
要解决: 如果您的规则进行修复并且编写为函数,例如
module.exports = function(context) {
// your rule
};
然后以这种格式重写您的规则
module.exports = {
meta: {
fixable: "code" // or "whitespace"
},
create(context) {
// your rule
}
};
eslint-plugin/require-meta-fixable 规则可以自动修复并强制您的规则正确指定 meta.fixable
。
eslint-plugin/prefer-object-rule 规则可以自动修复并强制您的规则使用对象格式而不是已弃用的函数格式编写。
有关编写规则的更多信息,请参阅规则文档。
相关问题: #13349
SourceCode#getComments()
在 RuleTester
中失败
早在 ESLint v4.0.0 中,我们就弃用了 SourceCode#getComments()
,但我们忽略了移除它。我们没有在 v8.0.0 中完全移除它,而是采取了中间步骤,更新 RuleTester
以在规则内部使用 SourceCode#getComments()
时使其失败。因此,所有现有规则将继续工作,但是当开发者为规则运行测试时,将会出现失败。
SourceCode#getComments()
方法将在 v9.0.0 中移除。
要解决: 如果您的规则使用 SourceCode#getComments()
,请使用 SourceCode#getCommentsBefore()
、SourceCode#getCommentsAfter()
或 SourceCode#getCommentsInside()
。
相关问题: #14744
速记属性 AST 格式的更改
ESLint v8.0.0 包括升级到 Espree v8.0.0 以支持新语法。反过来,Espree 的升级包含升级到 Acorn v8.0.0,它更改了速记属性在 AST 中的表示方式。这是一个例子
const version = 8;
const x = {
version
};
此代码创建一个属性节点,如下所示
{
"type": "Property",
"method": false,
"shorthand": true,
"computed": false,
"key": {
"type": "Identifier",
"name": "version"
},
"kind": "init",
"value": {
"type": "Identifier",
"name": "version"
}
}
请注意,key
和 value
属性都包含相同的信息。在 Acorn v8.0.0 之前(因此在 ESLint v8.0.0 之前),这两个节点由同一个对象表示,因此您可以使用 ===
来确定它们是否表示相同的节点,例如
// true in ESLint v7.x, false in ESLint v8.0.0
if (propertyNode.key === propertyNode.value) {
// do something
}
在 ESLint v8.0.0 中(通过 Acorn v8.0.0),键和值现在是单独的对象,因此不再等效。
要解决: 如果您的规则在速记对象文字属性的键和值之间进行比较,以确定它们是否是相同的节点,您需要通过以下两种方式之一更改您的代码
- 使用
propertyNode.shorthand
来确定属性是否是速记属性节点。 - 使用每个节点的
range
属性来确定键和值是否占据相同的位置。
相关问题: #14591
CLIEngine
类已被移除
CLIEngine
类已被移除,并由 ESLint
类替换。
要解决: 如果您当前正在使用 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() |
(已移除 ※2) |
resolveFileGlobPatterns() |
(已移除 ※3) |
- ※1
engine.getFormatter()
方法当前按原样返回加载的包的对象,这使得出于向后兼容性原因向格式化程序添加新功能变得困难。新的eslint.loadFormatter()
方法返回一个适配器对象,该对象包装加载的包的对象,以简化添加新功能的过程。此外,适配器对象可以访问ESLint
实例以计算默认数据(例如,使用加载的插件规则来制作rulesMeta
)。因此,ESLint
类仅实现loadFormatter()
方法的实例版本。 - ※2
CLIEngine#getRules()
方法具有副作用,因此已被移除。如果您使用CLIEngine#getRules()
来检索有关基于 lint 结果的规则的元信息,请改用ESLint#getRulesMetaForResults()
。如果您使用CLIEngine#getRules()
来检索所有内置规则,请从eslint/use-at-your-own-risk
导入builtinRules
以获取允许访问内部规则的非受支持的 API。 - ※3 自 ESLint v6.0.0 以来,ESLint 使用与
resolveFileGlobPatterns()
方法不同的逻辑来迭代文件,这使得此方法过时。
linter
对象已被移除
已弃用的 linter
对象已在 v8.0.0 中从 ESLint 包中移除。
要解决: 如果您正在使用 linter
对象,例如
const { linter } = require("eslint");
将您的代码更改为这样
const { Linter } = require("eslint");
const linter = new Linter();
/lib
入口点已被移除
从 v8.0.0 开始,ESLint 严格定义其公共 API。以前,您可以访问单个文件,例如 require("eslint/lib/rules/semi")
,但现在不再允许这样做。现在可以通过 /use-at-your-own-risk
入口点访问有限数量的现有 API 以实现向后兼容性,但是这些 API 未获得正式支持,并且可能随时中断或消失。
要解决: 如果您直接通过 /lib
入口点访问规则,例如
const rule = require("eslint/lib/rules/semi");
将您的代码更改为这样
const { builtinRules } = require("eslint/use-at-your-own-risk");
const rule = builtinRules.get("semi");
如果您直接通过 /lib
入口点访问 FileEnumerator
,例如
const { FileEnumerator } = require("eslint/lib/cli-engine/file-enumerator");
将您的代码更改为这样
const { FileEnumerator } = require("eslint/use-at-your-own-risk");