首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何做ESM动态输出?

如何做ESM动态输出?
EN

Stack Overflow用户
提问于 2022-06-23 12:30:11
回答 2查看 137关注 0票数 1

当我将项目设置为CommonJS时,以下导出代码用于工作

代码语言:javascript
复制
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模块,所以我使用了ESM export,而不是CJS exports,但是它一直抛给我错误。

代码语言:javascript
复制
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中类似的结构,以便以编程方式导出存储在变量中的函数?

EN

回答 2

Stack Overflow用户

发布于 2022-06-23 12:36:55

您不能使用ESM进行动态导出。无害环境管理要求出口必须是静态分析的。

相反,您可以导出动态定义的对象:

代码语言:javascript
复制
export const someName = {...cloudFunctions};

...or可能只是直接导出cloudFunctions,因为它似乎已经具备了您想要导出的内容:

代码语言:javascript
复制
export cloudFunctions;

从模块导入的代码将无法从导出的对象直接导入属性;相反,它必须导入对象,然后使用所需的属性。例如,如果我假设您做了direclty导出cloudFunctions

...then导入(比方说) whatever函数,然后假设您使用someName作为导出的名称:

代码语言:javascript
复制
import { someName } from "./the-module";
const { whatever } = someName;

// ...code using `whatever`...
票数 1
EN

Stack Overflow用户

发布于 2022-06-26 16:21:26

只是面临着同样的问题。经过一些研究,我意识到ESM并不直接支持动态导出。

代码语言:javascript
复制
export initFunctionReturnsObject();

有两个选项可以提供动态接口,两者都需要一些额外的代码才能正确导入。假设init.js具有由函数initFunctionReturnsObject生成的动态导出对象{ a,b}。那我们就可以

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

从‘./init.js’导入init;const { a,b}= init;

另一种方法是使用动态导入。

const {默认值:{ a,b}}=等待import('./init.js');

  1. export const obj = initFunctionReturnsObject()

从‘./init.js’导入{ obj };const { a,b}= obj;

我希望这将有助于解决ESM中动态导入的工作方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72730194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档