为什么 ESLint 不能根据 Node.js 版本检查语法?

Why can't ESLint check syntax against Node.js version?

我正在纯节点环境中开发。在我的 .eslintrc 文件中:

"env": {
  "node": true
}

我的 package.json 文件中指定了一个节点版本:

"engines": {
  "node": ">=16.13.0"
}

遇到的第一个 const 导致抛出 Parsing error: The keyword 'const' is reserved 错误。我知道我可以通过向 ESLint 指定 ecmaVersion 来摆脱它。但是为什么 ESLint 不能自己弄清楚正在使用的 Node 版本,并在没有冗余代码的情况下使 the appropriate keywords and global variables(例如 Promises)对我们可用?

另外,据我了解ECMA 规范≠节点。因此,通过指定一个 ECMA 版本,我们实际上可能会让 ESLint 相信某个功能可用,但事实并非如此,不是吗?

configuring ESLint, and in particular specifying environments:

An environment provides predefined global variables.

因此,配置 env 并不表示您想使用哪种 ECMAScript 语法(语言特性),而是表示正在使用哪些预定义的全局变量。

此外,在parser options下面,你可以看到:

By default, ESLint expects ECMAScript 5 syntax.

因此,您需要明确选择要支持 ECMAScript 的哪些 ES6+ 功能,因为 ESLint 不会通过阅读 engine 字段来推断您要使用的语言选项 package.json 文件时使用 env: { node: true }.

您可以通过包含相关的 parserOptions 来获得对 const 和其他 ES6 功能的支持,正如您所指出的:

parserOptions: {
  ecmaVersion: 6 // Or whatever version you want to target
}

有趣的是,您还可以通过包含 es6 环境来获得对 const(和其他 ES6 功能)的支持:

env: {
  node: true, // To keep support for Node globals
  es6: true
}

之所以有效,是因为

this automatically sets the ecmaVersion parser option to 6

eslint-plugin-node 软件包正是这样做的。

它在内部维护着一个map of ECMAScript features and the minimal version of Node that support them, that's based on node.green

它读取 package.json 的引擎字段来检测我们的模块支持哪些 Node.js 版本。

node/no-unsupported-features 规则将配置的 Node.js 版本上不支持的 ECMAScript 语法报告为 lint 错误。

唯一的问题是它最多只支持 ECMAScript 2019,并且已经两年没有被触及了。

所以这个问题的答案是:它可以,尽管你必须构建自己的插件来实现它,因为目前还没有最新的解决方案今天