【问题标题】:"The requested module ' does not provide an export named 'default' " error, but only in relative import“请求的模块'不提供名为'default'的导出”错误,但仅在相对导入中
【发布时间】:2022-02-08 01:37:10
【问题描述】:

我有这个来自外部的 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 模块的构建方式。它如何在一种情况下起作用,而在另一种情况下却不起作用?这是节点 12。

【问题讨论】:

  • 我猜模块文件夹中的package.json没有里面有"type": "module",但是你的模块(显然)有,因为你'正在使用 ESM。 Node.js 在通过 ESM (details) 加载旧式 CommonJS 模块时会进行一些自动转换。
  • api.js的导出是什么样的?
  • true,模块的package.json中没有type:module。
  • api.js 是用 webpack 构建的。我认为它转换为 IEFE 模块,没有导出语句。

标签: javascript node-modules


【解决方案1】:

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

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

exports.example = function example() { };

应该是

export function example() { }

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

【讨论】:

  • 我不知道这种转换。谢谢!
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2021-11-02
  • 2022-01-25
  • 2022-11-16
  • 2023-02-02
  • 2023-01-27
  • 2021-10-03
  • 2022-01-18
相关资源
最近更新 更多