NodeJS“必须使用导入来加载ESmodule”

IT技术 javascript node.js import export
2021-03-02 19:34:13

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

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

你好.js

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

索引.js

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

我哪里错了?

6个回答

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

  1. 节点版本 >= 14。它只适用于最新版本的节点。
  2. 确保您的 package.json 包含一行“type”:“module”,如果没有此行,节点假定您要使用 Common JS module而不是 ESM。
我不知道发生了什么,但我去节点 14 不得不更改为“类型”:“module”运行成功,删除了“类型”:“module”,现在我可以在没有它的情况下运行它:D
2021-04-24 19:34:13
还记得删除node_modules并重新做一个npm install
2021-05-03 19:34:13
我的文件被称为 .mjs 那么为什么它需要在 packages.json 中使用“type”:“module”,这个更改会破坏其他脚本:< 我将不得不在我的脚本运行之前添加它然后删除再说一遍^^不漂亮..
2021-05-14 19:34:13

使用版本 2。

npm install node-fetch@2

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

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

希望这可以帮助:

我在构建 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

然后我意识到我使用的节点版本与用于在此项目中安装软件包的节点版本不同

我有两个选择:

  1. 将节点版本更改为该项目所需的版本并重新构建。
  2. 保留您拥有的节点版本并删除node_modules目录和package-lock.json文件,然后再次执行npm install

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

我不想发布关于相同的另一个问题,所以我在这里发布了一个答案。

如果您的节点版本低于 14,例如 v12 - 您必须指定标志:

node --experimental-modules your.mjs
以该顺序。甚至不要考虑这样做node your.mjs --experimental-modules
2021-05-11 19:34:13

问题是 node 目前还不支持本地导入和导出。根据文档,它仍然是实验性的我建议您使用 babel 来编译您的代码并允许您使用导入和导出。

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

npx babel-node index.js

这是@babel/node的文档与文档状态一样,此命令仅适用于本地开发。在生产中,他们建议像配置快乐编码!

@AluanHaddad - 为了清楚起见,Node 14 是新的。上个月它刚刚进入“当前”状态,直到今年 10 月才会“活跃”。所以,v14 正在到来的过程中。人们可以根据需要去获取它,但是当前和活跃之间的时间点是确保它稳定并给图书馆作者时间来适应它(如有必要)。而且,nodejs v14 文档说“默认情况下启用对 ECMAScript module的实验支持。”。因此,您在 V14 中不再需要该标志,但它仍处于“实验”阶段。
2021-04-18 19:34:13
自节点 14 起不再需要该标志
2021-05-01 19:34:13