# 迁移到 v8.x

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
  • CLIEngine 类已被删除
  • linter 对象已被移除
  • /lib 入口点已被删除

# 不再支持 Node.js 10、13 和 15

``

Node.js 10、13、15 都在 2020 年或 2021 年初达到生命周期的终点。ESLint 从 ESLint v8.0.0 开始正式放弃对这些版本的 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 已经从核心中移除了 codeframetable 格式化程序。这些格式化程序需要 ESLint 中其他任何地方都没有使用过的依赖项,删除它们可以让我们减小 ESLint 的大小,从而加快安装速度。

**处理:**如果您使用 codeframetable 格式化程序,则需要分别安装独立的 eslint-formatter-codeframeeslint-formatter-table 包,才能在 ESLint v8.0.0 中使用它们。

相关问题:#14277#14316

# 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 预设中启用了四个新规则。

  • 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 中完全删除它,而是在规则内部使用 SourceCode#getComments() 时采取更新 RuleTester 以使其失败的中间步骤。因此,所有现有规则都将继续工作,但当开发人员为规则运行测试时,将会失败。

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"
    }
}

请注意,keyvalue 属性都包含相同的信息。在 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)中,键和值现在是独立的对象,因此不再等价。

**处理:**如果您的规则在速记对象字面属性的键和值之间进行比较以确定它们是否是同一个节点,则需要通过以下两种方式之一更改代码:

相关问题:#14591

# CLIEngine 类已被删除

``

CLIEngine 类已被移除并被 ESLint 类 取代。

**处理:**如果您当前使用的是 CLIEngine,请更新您的代码以使用新的 ESLint 类。下表将现有的 CLIEngine 方法映射到它们的 ESLint 对应项:

  • ※1 engine.getFormatter() 方法目前按原样返回已加载包的对象,由于向后兼容的原因,难以为格式化程序添加新功能。新的 eslint.loadFormatter() 方法返回一个适配器对象,该对象包装了已加载包的对象,以简化添加新功能的过程。此外,适配器对象可以访问 ESLint 实例来计算默认数据(例如,使用加载的插件规则来制作 rulesMeta)。因此,ESLint 类只实现了 loadFormatter() 方法的实例版本。
  • ※2 CLIEngine#getRules()方法有副作用,因此被删除。如果您使用 CLIEngine#getRules() 根据 linting 结果检索有关规则的元信息,请改用 ESLint#getRulesMetaForResults()。如果您使用 CLIEngine#getRules() 检索所有内置规则,请从 eslint/use-at-your-own-risk 导入 builtinRules 以获得允许访问内部规则的不受支持的 API。
  • ※3 从 ESLint v6.0.0 开始,ESLint 使用与 resolveFileGlobPatterns() 方法不同的逻辑来迭代文件,使得该方法已经过时。

相关问题:RFC80#14716#13654

# linter 对象已被移除

``

已弃用的 linter 对象已从 v8.0.0 中的 ESLint 包中删除。

**处理:**如果您使用的是 linter 对象,例如:

const { linter } = require("eslint");

将您的代码更改为:

const { Linter } = require("eslint");
const linter = new Linter();

相关问题:RFC80#14716#13654

# /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");

相关问题:RFC80#14716#13654

Last Updated: 5/13/2023, 8:55:38 PM