首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ESM导出*模块除外

ESM导出*模块除外
EN

Stack Overflow用户
提问于 2022-06-03 08:58:35
回答 1查看 501关注 0票数 1

考虑到我有两个带有大量命名导出的导入(太多,无法全部写出),我希望将这些导入重新导出,但其中的几个除外。在我的例子中,这是因为一些出口发生了碰撞。

作为我想要存档的一个例子,让我们假设我们有两个文件:

foo.js

代码语言:javascript
复制
export const a = 1;
export const b = 2;

bar.js

代码语言:javascript
复制
export const b = 1;
export const c = 3;

如果我想使用CommonJS聚合和再导出它们,我可以这样做:

代码语言:javascript
复制
/* use rest destructuring to put everything except "b" into variable "foo" */
const { b, ...foo } = require("./foo"); 
const bar = require("./bar");

module.exports = {
    ...foo,
    ...bar
};

当我使用类型记录时,我得到的最接近的是以类似的方式使用export = { ... }

代码语言:javascript
复制
import * as foo from "./foo";
import * as bar from "./bar";

const { b, ...foo2 } = foo;

export = {
    ...foo2,
    ...bar,
};

不过,据我理解,这将创建一个带有CommonJS module.exports的文件,而不是一个正确的ESM模块(并且可能需要esModuleInterop)。这是一个类型文本结构,在编写香草JS时不可用。

是否有一种方法可以使用ESM import / export来存档?

EN

回答 1

Stack Overflow用户

发布于 2022-06-03 09:12:41

是否有一种方法可以使用ESM导入/导出来存档?

不,不是在纯标准的ESM中,不是不做您想要避免的事情:列出指定的导出。在ESM import/export中没有"rest“概念。

我想您知道这一点,但是您可以导出一个具有abc属性的对象,但这与重新导出命名的导出完全不同。它不是实时绑定,导入其部件的语法与导入命名导出不同(除非涉及构建时工具(如TypeScript或绑定器等))。

只是FWIW,如下所示(它非常类似于您的TypeScript版本,接近尾声),但我不认为这是您想要的:

reexport.js

代码语言:javascript
复制
import * as foo from "./foo.js";
import * as bar from "./bar.js";

const { b, ...restOfFoo } = foo;
export default {
    ...restOfFoo,
    ...bar,
};

然后使用它是:

代码语言:javascript
复制
// Import the object (which is the default export)
import stuff from "./reexport.js";

// Destructure into local vars (optional, but...)
const { a, b, c } = stuff;

// Use it...
console.log(a, b, c);

这都是标准的ESM。

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

https://stackoverflow.com/questions/72487144

复制
相关文章

相似问题

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