访问 import.meta.url 时出现“解析错误:意外的令牌导入”(Cloud9 IDE)

drm*_*wer 3 javascript lint eslint eslintrc aws-cloud9

使用以下 Node.js 代码:

import { fileURLToPath } from 'node:url';
import path from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(fileURLToPath(import.meta.url));
Run Code Online (Sandbox Code Playgroud)

我看到以下与参考相关的 lint 错误import.meta.url

在此输入图像描述

此代码段将按照node.js 指南__filename复制并复制到 ESM 中。使用如下时会出现相同的错误...这也在官方指南中:__dirnameimport.meta.url

import { readFileSync } from 'fs';
const buffer = readFileSync(new URL('./data.proto', import.meta.url));
Run Code Online (Sandbox Code Playgroud)

我已经看过这个,但它没有解决我的问题。这是专门在 Cloud9 IDE 中......不是当前的 AWS Cloud9,而是基于此存储库的自托管 Cloud9 (最后更新于 4 年前)。(AWS) Cloud9 的唯一指导在此页面上:

在此输入图像描述

我可以使用此.eslintrc文件获得某些基本规则,例如

{
  rules: {
    semi: ["error", "never"]
  }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以我知道配置文件正在IDE中生效。但看不到禁用“意外令牌导入”错误的适当规则。

编辑:以下内容似乎相关,但我无法确定它是否真正得出了结论:

https://github.com/eslint/eslint/issues/12518

https://github.com/eslint/eslint/pull/13196

https://github.com/eslint/eslint/issues/13133

GOT*_*O 0 6

这实际上是一个有根据的猜测,因为我没有使用 Cloud9 IDE。如果您的 .eslintrc 文件被识别,您需要添加适当的解析器选项,例如:

{
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module"
  },
  "rules": {
    "semi": ["error", "never"]
  }
}
Run Code Online (Sandbox Code Playgroud)

原因是 ESLint 解析器默认将所有 JavaScript 源视为 ES5 脚本,而import.meta自 ECMAScript 2020 以来,该语法仅在模块中允许。

更新

"ecmaVersion": 2020ESLint 6 及以上版本支持该设置。另一个需要认识到的选择import.meta是使用像 Babel 这样的自定义解析器。为Babel 解析器安装的软件包是@babel/core@babel/eslint-parser。.eslintrc中的相关设置在这里:

{
  "parser": "@babel/eslint-parser",
  "parserOptions": {
    "ecmaVersion": 2020,
    "requireConfigFile": false
},
Run Code Online (Sandbox Code Playgroud)

注意:我无法在其存储库的文档中找到 Babel 解析器支持哪些版本的 ESLint(上面的链接)。我在代码中只能看到支持ESLint 7和8。如果 Babel 的当前版本无法与您的 ESLint 版本兼容,您可能需要尝试安装旧版本并查看它们是否有效。在这种情况下,可能需要额外的插件,例如syntax-import-meta 。