在 Node.js 中导入:错误“必须使用导入来加载 ES 模块”[重复]

Posted

技术标签:

【中文标题】在 Node.js 中导入:错误“必须使用导入来加载 ES 模块”[重复]【英文标题】:Importing in Node.js: error "Must use import to load ES Module" [duplicate] 【发布时间】:2020-08-23 11:55:49 【问题描述】:

我正在尝试将 myArrhello.js 导入到 index.js。但是我得到一个错误

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module

文件 hello.js

export let myArr = ['hello', 'hi', 'hey'];

文件 index.js

import  myArr  from './hello.js';
console.log(myArr);

我哪里错了?

【问题讨论】:

什么版本的node.js?如果您的文件没有文件扩展名.mjs,那么您必须做一个whole set of rules 才能让importexport 在node.js 中工作。当我尝试它时,我发现它非常痛苦。我相信有一天它只是内置且易于使用,但 node.js 还没有。 【参考方案1】:

我运行您的代码没有任何问题。检查两件事:

    Node.js 版本 >= 14。它仅适用于最新版本的 Node.js。 确保您的package.json 包含"type": "module" 的一行。如果没有这一行,Node.js 会假定您要使用 CommonJS 模块而不是 ESM。

【讨论】:

我的文件被称为 .mjs 那么为什么它需要 package.json 中的“类型”:“模块”,这个更改会破坏其他脚本: 我不知道发生了什么,但我去节点 14 必须更改为“类型”:“模块”成功运行,删除“类型”:“模块”,现在我可以在没有它的情况下运行它:D 还要记得删除node_modules并重新做一个npm install 我都有。节点是 14.17,package.json 有 "type": "module"。我不知道我哪里出错了。 导致this error【参考方案2】:

使用版本 2:

npm install node-fetch@2
来自 v3 的

node-fetch 是一个仅限 ESM 的模块 - 您无法使用 require() 导入它。

如果您无法切换到 ESM,请使用与 CommonJS 保持兼容的 v2。将继续为 v2 发布关键错误修复。

【讨论】:

我很困惑,这个问题和node-fetch有什么关系?【参考方案3】:

我在构建 React 项目时遇到了类似的问题。

这是错误:

ERROR in ./src/index.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/pradeep/Work/my_project/node_modules/@babel/runtime/helpers/interopRequireWildcard/_index.mjs

然后我意识到我使用的是一个与用于在此项目中安装包的版本不同的 Node.js 版本

我有两个选择:

    将 Node.js 版本更改为此项目所需的版本并重新构建。 保留您拥有的 Node.js 版本并删除 node_modules 目录和 package-lock.json 文件并再次执行 npm install .

我选择了第一种方法,它对我很有效。

【讨论】:

【参考方案4】:

如果您的 Node.js 版本低于 14,例如 v12 - 您必须指定此标志:

node --experimental-modules your.mjs

【讨论】:

按这个顺序。甚至不要考虑这样做node your.mjs --experimental-modules【参考方案5】:

hello.js 重命名为 hello.mjs

您现在正在使用带有 .js 扩展名的 CommonJS。要导入 ES6 模块,您必须将要导入的文件的扩展名更改为 .mjs,以便它知道它是一个 ES6 模块。

【讨论】:

【参考方案6】:

我使用 nvm 安装最新的稳定版 Node.js。

要删除 package-lock.json 文件和 node_modules folder,请运行 npm。然后我npm start 来解决我的问题。

【讨论】:

【参考方案7】:

问题是 Node.js 目前还不支持原生的导入和导出。根据the documentation,它仍然是实验性的。我建议您使用Babel 编译您的代码并允许您使用导入和导出。

例如,您可以安装 @babel/node 包并使用以下命令运行您的项目:

npx babel-node index.js

这里是@babel/node 的文档。与文档状态一样,此命令仅用于本地开发。在生产中,他们推荐a configuration like this。

【讨论】:

从节点 14 开始不需要该标志 @AluanHaddad - 只是为了清楚起见,节点 14 是相当新的。它上个月才“流行”起来,直到今年 10 月才会“活跃”。因此,v14 正在到来的过程中。如果他们愿意,人们可以去获取它,但是当前和活跃之间的时间点是确保它是稳定的,并给图书馆作者时间来适应它(如果有必要的话)。而且,nodejs v14 文档说“默认启用对 ECMAScript 模块的实验支持。”。因此,在 V14 中您不再需要该标志,但它仍处于“实验”阶段。

以上是关于在 Node.js 中导入:错误“必须使用导入来加载 ES 模块”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 node.js 中导入模块 [重复]

如何在 Node.js REPL 中导入 ES 模块?

在 node.js 中导入 sql 文件并针对 PostgreSQL 执行

如何在 node.js 中导入 font-awesome 以在 react.js 中使用?

在 ES 模块(Node.js)中导入 JSON 文件

node.js 错误 npm 安装