【发布时间】:2022-01-20 17:42:17
【问题描述】:
我很难理解如何将 CommonJS 模块导入 ESM 语法。我目前正在尝试使用库url-metadata。 url-metadata 将顶级导出公开为可调用对象(实际上并不符合 CommonJS、AFAIK):
const urlMetadata = require('url-metadata')
urlMetadata(URL, ...)
不能写:
import urlMetadata from 'urlMetadata'
因为没有定义默认导出。
相反,我必须写:
import * as urlMetadata from 'url-metadata'
或者:
import urlMetadata = require("url-metadata")
我试图阅读 Node 中的模块加载,但我仍然对执行此操作的正确方法和原因感到有些困惑。
【问题讨论】:
-
你read all of this了吗?
-
这个问题一般来说没有意义。 “因为没有定义默认导出” - 这不是真的,cjs 导出通常会转换为默认 esm,除非您的设置使其工作方式不同。 "import urlMetadata = require("url-metadata")" - 这不是有效的 JS。如果您使用 TS,则应重写问题以反映这一点。
-
import * as urlMetadata from 'url-metadata'从 ESM 模块导入 CommonJS 模块有什么问题? -
也许我的问题是我正在使用 TS 并且没有正确掌握这个概念。导入为默认
import urlMetadata from ...会产生此错误:TypeError: (0 , url_metadata_1.default) is not a function。虽然import * as urlMetadata ...工作正常。我不明白为什么会这样。 -
好的,我认为这个问题很难回答,因为我在不同的概念上苦苦挣扎,无法以连贯的形式提出。从那以后,我发现我忘记为 Typescript 编译器设置
esModuleInterOp标志。如果没有此标志module.exports未设置为默认导出,则会产生类型错误。通过执行import * as ...加载了整个奇异的exports对象,这也有效,但可以说不是最好的方法。
标签: javascript node.js ecmascript-6 ecmascript-5