如何进行ESM动态导出?



当我将项目设置为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。然后我们可以

  1. export default initFunctionReturnsObject() // generate { a, b }

    import init from './init.js';
    const { a, b } = init;
    
    另一种方法是使用动态导入
    const { default: { a, b } } = await import('./init.js');
    
  2. export const obj = initFunctionReturnsObject()

    import { obj } from './init.js';
    const { a, b } = obj;
    

我希望这将有助于整理动态导入如何在ESM中工作

相关内容

  • 没有找到相关文章

最新更新