为什么 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,并且已经两年没有被触及了。
所以这个问题的答案是:它可以,尽管你必须构建自己的插件来实现它,因为目前还没有最新的解决方案今天
我正在纯节点环境中开发。在我的 .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,并且已经两年没有被触及了。
所以这个问题的答案是:它可以,尽管你必须构建自己的插件来实现它,因为目前还没有最新的解决方案今天