当我将项目设置为CommonJS时,下面的导出代码用于工作
let group: keyof typeof cloudFunctions;
// loop through all groups built above and export them
for (group in cloudFunctions) {
if (group != null) {
exports[group] = cloudFunctions[group];
}
}
现在,我正试图将其转换为ESM模块,所以我使用ESMexport
,而不是CJSexports
,但它一直抛出我的错误。
let group: keyof typeof cloudFunctions;
// loop through all groups built above and export them
for (group in cloudFunctions) {
if (group != null) {
export[group] = cloudFunctions[group];
}
}
我唯一可以解决的方法是在顶层的for循环之外一个接一个地静态和手动声明。
问题:我如何在ESM中采用类似的CJS结构,以便我可以以编程方式导出存储在变量内的函数?
不能使用ESM进行动态导出。ESM要求导出是静态可分析的。
相反,您可以导出动态定义的对象:
export const someName = {...cloudFunctions};
…或者直接导出cloudFunctions
,因为它似乎已经有你想要导出的内容:
export { cloudFunctions };
从模块导入的代码将不能直接从导出的对象导入属性;相反,它必须导入对象,然后使用所需的属性。例如,如果我假设您直接导出cloudFunctions
:
…然后导入(例如)whatever
函数,然后假设您使用someName
作为导出的名称:
import { someName } from "./the-module";
const { whatever } = someName;
// ...code using `whatever`...
刚刚遇到了同样的问题。经过一番研究,我意识到ESM不支持直接动态导出,即
export initFunctionReturnsObject();
有两个选项提供动态接口,都需要一些额外的代码来正确导入。假设我们有一个initFunctionReturnsObject函数生成的带有动态导出对象{a, b}的init.js。然后我们可以
export default initFunctionReturnsObject() // generate { a, b }
另一种方法是使用动态导入import init from './init.js'; const { a, b } = init;
const { default: { a, b } } = await import('./init.js');
export const obj = initFunctionReturnsObject()
import { obj } from './init.js'; const { a, b } = obj;
我希望这将有助于整理动态导入如何在ESM中工作