【发布时间】:2020-09-13 22:31:23
【问题描述】:
Node documentation on ECMAScript Modules 建议向用户提供 CommonJS 脚本和 ES 模块脚本的“双包”。
具体来说,他们建议将 ES 模块脚本转译为 CommonJS,然后使用“ES 模块包装器”,这是一个 ES 模块脚本,它从 CJS 导入并将其名为 export 的 CJS 重新导出为名为 export 的 ESM。
// ./node_modules/pkg/wrapper.mjs
import cjsModule from './index.cjs';
export const name = cjsModule.name;
我的问题是:是否可以以相反的方式执行此操作,以 ES 模块格式提供我的脚本,但在 CommonJS 中添加一个简单的包装文件,允许 CJS 用户 require 它?
就我而言,我看不到在同步代码中执行此操作的方法。在我看来,CommonJS 脚本只能通过异步动态import() 导入 ES 模块。
(async () => {
const {foo} = await import('./foo.mjs');
})();
但这意味着我的 CJS 脚本无法导出任何依赖于 foo 的内容。
【问题讨论】:
-
@jfriend00 我认为您正在回答相反的问题。你在告诉我为什么 ES 模块不能
import {foo} from './foo.cjs',但我想知道 CommonJS 是否可以const {foo} = importSync('./foo.mjs')(或者,如果不能,为什么不能) -
ES 模块在语法上与没有它的 js 版本不兼容。所以
importSync需要即时转译代码。 -
@YuryTarabanko 已经可以使用
import()在 Node 14 的 CJS 中导入 ESM,而无需转译。我只想同步做。 -
"我的 CJS 脚本无法导出任何依赖于 foo 的内容。" - 他们总是可以为它导出一个 Promise :-)
标签: javascript es6-modules commonjs