【问题标题】:Is there a way to create a module that can be consumed by both ESM and CJS applications?有没有办法创建一个可以被 ESM 和 CJS 应用程序使用的模块?
【发布时间】:2021-07-22 21:45:03
【问题描述】:

我有一个后端 CJS 应用程序和一个前端 ESM 应用程序。还有一个我在 ESM 中创建的节点模块。 节点模块适用于我的 ESM 应用程序,因为它们都使用 ESM import 语法。 尝试在 CJS 应用程序中使用它显然会引发错误,因为它无法读取 ESM import 语法。

我尝试使用Rollup.jsESM 代码转换为CJS 并在我的package.json 文件中使用conditional exports,但这不起作用。

【问题讨论】:

  • 重要问题:为什么?节点can import either,只要你的项目和你的依赖项目,清楚地表明它们使用哪种风格的ES(即如果你的代码使用ESM,你需要在你的package.json中指定type: "module" )
  • @Mike'Pomax'Kamermans 嗨,迈克。而且因为我有一个像 dataUtils 这样的文件,它用于我的前端应用程序,也用于我的后端 api 应用程序。因此,将其放入该文件的 npm 包中是有意义的。因此,当我的后端 api 使用它时,我需要在 CJS 中使用它,而当我的前端应用程序使用它时,我需要在 ES6 中使用它。
  • 不,你没有。您可以为两者编写 ES6,因为 Node 可以完美地导入和运行 ES6,即使在本身是 CJS 的项目中:如果您的代码使用 ES 模块,只需在 package.json 中设置正确的值而不是传统的 commonjs 需要方法。

标签: javascript node.js commonjs rollupjs mjs


【解决方案1】:

假设它是一个类似的库:

我的图书馆.js

// No require on top. They will be local to their use.
const myLibrary = ...

// export default instead of module.exports
export default myLibrary

该库必须首先将其扩展名重命名为 .mjs ("my-library.js" = "my-library.msj")

那么,

在 CJS (Node.js) 中 =>

动态导入:

const {default: myUtilityLib } = await import("./my-library.mjs");

在 ESM(浏览器)中 =>

照常标准导入:

import myUtilityLib from "./my-library.mjs"

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2016-09-02
    相关资源
    最近更新 更多