在Node.js中导入:错误"必须使用import来加载ES模块"

138

我正在尝试从hello.jsmyArr导入到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);
我犯了什么错误?

2
什么版本的node.js?如果您的文件没有文件扩展名.mjs,则有一整套规则需要遵循才能使importexport在node.js中正常工作。当我尝试使用它时,我发现它非常麻烦。我相信总有一天它会变得内置且易于使用,但是node.js目前还没有达到那个程度。 - jfriend00
7个回答

84

使用版本2:

npm install node-fetch@2

node-fetch从第三个版本开始是一个只支持ESM的模块 - 您无法使用require()导入它。

如果您无法切换到ESM,请使用仍与CommonJS兼容的v2。关键bug修复将继续发布对于v2。


67
我有点困惑,这个问题和 node-fetch 有什么关系? - Maxime Chéramy
8
这个回答并没有回答这个问题。 - Clonkex
6
对我而言,问题出在试图在使用ts-node进行调试时,在TypeScript中使用node-fetch@3。通过网页搜索找到了这里,我猜想许多其他人也遇到了同样的问题。 - Felipe
3
虽然这不是对这个问题的回答,但我猜大多数来到这里的人都因为那个包而遇到了这个问题。这实际上解决了目前的问题。虽然我正在使用Node 14.9,但不确定如何处理导入。 - Bruno
2
这似乎与问题无关,但它确实为我修复了错误! - lizziepika
这个有毛病了... - masterxilo

64

我已经顺利运行了你的代码,请检查以下两点:

  1. Node.js 版本 >= 14。它只能在最新版本的 Node.js 上运行。
  2. 确保你的 package.json 文件包括一行 "type": "module"。没有这一行,Node.js 将默认使用 CommonJS 模块而非 ESM。

1
我的文件名为.mjs,那么为什么它需要在packages.json中添加"type": "module"呢?这个更改会破坏其他脚本:< 我将不得不进行一些hack,在我的脚本运行之前添加它,然后再将其删除^^ 这不是很好看... - OZZIE
我不知道发生了什么,但我切换到了 node 14,在 "type": "module" 下成功运行,然后删除了 "type": "module",现在我可以顺利运行它:D - OZZIE
8
请记得删除 node_modules 目录并重新运行 npm install - Diego Betto
1
我两者都有。Node 版本是 14.17,package.json 文件中有 "type": "module"。我不知道哪里出了问题。 - Pramod
1
导致此错误 - Stoyan Georgiev
还要记得删除--require|-r标志,例如node -r ./server - Ricky Boyce

25

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

我有两个选择:

  1. 更改Node.js版本以符合此项目要求并重新构建。
  2. 保留您当前的Node.js版本,删除node_modules目录和package-lock.json文件,然后再次运行npm install命令。

我选择了第一种方法,并且它对我起了作用。


如果你还没有意识到,我仍然会苦苦挣扎。谢谢。 - Martinedo

6

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

node --experimental-modules your.mjs

2
按照顺序进行操作。甚至不要考虑使用 node your.mjs --experimental-modules - btjakes

5

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

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


4

hello.js 重命名为 hello.mjs

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


2
问题在于 Node.js 目前还不支持原生的 import 和 export。根据 文档,它仍处于实验阶段。我建议您使用 Babel 编译您的代码,并使您能够使用 import 和 export。
例如,您可以安装 @babel/node 包,并使用以下命令运行您的项目:
npx babel-node index.js

这是@babel/node的文档。正如文档所述,此命令仅适用于本地开发。在生产环境中,他们建议使用类似于这样的配置

2
自从 Node 14 版本起,不需要使用标志。 - Aluan Haddad
2
@AluanHaddad - 仅为了明确起见,Node 14相当新。它在上个月才刚刚成为“current”,并且要到今年10月左右才会变成“active”。因此,v14正在到来的过程中。人们可以去获取它,但是当前和活跃之间的时间段的重点是确保它稳定,并给库作者适应它的时间(如果需要)。而且,nodejs v14文档说:“默认情况下启用了对ECMAScript模块的实验性支持。”。因此,在V14中不再需要该标志,但它仍处于“实验”阶段。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接