【问题标题】:Importing CommonJS modules to an ESM syntax将 CommonJS 模块导入 ESM 语法
【发布时间】:2022-01-20 17:42:17
【问题描述】:

我很难理解如何将 CommonJS 模块导入 ESM 语法。我目前正在尝试使用库url-metadataurl-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


【解决方案1】:
import urlMetadata from 'url-metadata';

是语法糖

import { default as urlMetadata } from 'url-metadata';

两者都可以正常工作。

CommonJS 模块中分配给module.exports 的值是默认导出。

请参阅Node.js 文档。

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2021-11-23
    • 2020-12-23
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多