(node:9511) ExperimentalWarning: E​​SM 模块加载器是实验性的

Posted

技术标签:

【中文标题】(node:9511) ExperimentalWarning: E​​SM 模块加载器是实验性的【英文标题】:(node:9511) ExperimentalWarning: The ESM module loader is experimental 【发布时间】:2020-11-28 16:36:08 【问题描述】:

我正在尝试在服务器端使用 ES6。我已将端点与服务器文件分开:

archive.js:

import  Router  from "express";
const router = Router();

router.get("/", async (req, res) =>  "some code");

export default router;

当我想像这样将它导入我的服务器文件时:

import archive from "./endpoints/archive.js";
app.use("/archive", archive);

它给了我一个错误:

(node:9565) ExperimentalWarning:ESM 模块加载器是实验性的。 内部/模块/run_main.js:54 internalBinding('errors').triggerUncaughtException()

有什么想法吗?我不想回到 require/module.exports

【问题讨论】:

什么版本的nodejs?默认情况下,.js 文件被假定为 CommonJS 文件,而不是 ESM 模块,除非您在 package.json 文件中适当地标记了它。通过将 ESM 模块设为 .mjs 文件而不是 .js 文件来让 ESM 模块工作要容易得多,因为加载器假定任何 .mjs 文件都是 ESM 模块。此警告/错误出现在哪个文件中? 我在我的 package.json 和每个 js 文件中都有 type: module 我正在使用导入/导出没有任何问题。仅针对此行我有问题:从“./endpoints/archive.js”节点版本导入存档:v12.18.3 【参考方案1】:

这是我从 github repo 中提取的一个新目录。我已经尝试了很多事情/解决方案,但结果我必须克隆到一个新的目录/环境。 找不到问题或适当的修复,但在新目录/环境中我没有这个问题。

【讨论】:

【参考方案2】:

您可以使用 Node v14.12.0;在哪里解决了这个问题,并阅读此文档https://nodejs.org/api/esm.html#esm_package_json_type_field

【讨论】:

【参考方案3】:

经过几次尝试后,我意识到“nodemon”上的“--experimental-modules”标志会导致在整个应用程序中实现导入时出现问题,因此我确实更新了该标志以使用新标志来显示显式文件名”-- es-module-specifier-resolution=node" 现在完美运行 这里有一篇关于这个新标志的文章:https://nodejs.medium.com/announcing-a-new-experimental-modules-1be8d2d6c2ff

因此,对于 explane,您可以执行如下脚本:

nodemon --es-module-specifier-resolution=node

还要记住你使用的 nodejs 版本低于 12.XX、14.XX 或最后一个稳定版本。

Upgrade Node.js to the latest version on Mac OS

我希望这可以帮助更多的开发者:)

【讨论】:

以上是关于(node:9511) ExperimentalWarning: E​​SM 模块加载器是实验性的的主要内容,如果未能解决你的问题,请参考以下文章