相对导入时出现“请求的模块'没有提供名为'default'的导出项”错误

9

我有一个来自外部的API模块。当它被安装为node_module(使用npm install)时,这样导入就可以工作:

import MyAPI from 'api'

然而,当我查看node_modules中的api文件夹并取出api.js时,这是模块的入口点,然后进行相对导入,如下所示:

import MyAPI from './api.js'

然后我遇到了错误:

"The requested module ./api.js does not provide an export named 'default'"

我无法控制api模块的构建方式。它为什么在一个场景下可用,而在另一个场景下则不行?这是Node 12。


我猜测模块文件夹中的 package.json 没有 包含 "type": "module",但是你的模块(显然)包含了该项,因为你正在使用 ESM。当通过 ESM 加载旧式 CommonJS 模块时,Node.js 会进行一些自动转换(详情)。 - T.J. Crowder
api.js的输出是什么样子的? - T.J. Crowder
true,模块的package.json文件中没有type:module。 - Gnut
api.js是使用webpack构建的。我认为它翻译成IEFE模块,没有导出语句。 - Gnut
1个回答

21

你已确认模块文件夹中的 package.json 文件中没有包含 "type": "module"。这就是问题所在。它正在使用旧的 CommonJS 系统,而不是您的模块使用的新版本标准 ESM 系统。在通过 ESM 加载旧式 CommonJS 模块时,Node.js 会进行一些自动转换(详细信息)。

如果你想将该文件从其模块中复制出来并在不同的模块环境中使用它,则必须将其导出(和可能的导入)转换为ESM。例如:

exports.example = function example() { };

它会是什么

export function example() { }

但这可能会很复杂,因为这两个系统的工作方式不同。CommonJS是动态的,基于属性赋值(尽管结果是静态的),而ESM是静态的、声明式的(尽管在某些方面也是动态的)。


2
我不知道这个转换。谢谢! - Gnut

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