ESM 导出 * 除模块外

ext*_*ext 5 javascript typescript es6-modules

鉴于我有两个导入,其中有很多命名导出(太多了,无法将它们全部写出来),并且我想重新导出它们,除了其中一些。就我而言,这是因为一些出口发生冲突。

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

foo.js

export const a = 1;
export const b = 2;
Run Code Online (Sandbox Code Playgroud)

bar.js

export const b = 1;
export const c = 3;
Run Code Online (Sandbox Code Playgroud)

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

/* use rest destructuring to put everything except "b" into variable "foo" */
const { b, ...foo } = require("./foo"); 
const bar = require("./bar");

module.exports = {
    ...foo,
    ...bar
};
Run Code Online (Sandbox Code Playgroud)

当我使用打字稿时,我得到的最接近的是以export = { ... }类似的方式使用:

import * as foo from "./foo";
import * as bar from "./bar";

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

export = {
    ...foo2,
    ...bar,
};
Run Code Online (Sandbox Code Playgroud)

然而,据我了解,这将使用 CommonJS 创建一个文件,module.exports而不是正确的 ESM 模块(并且可能需要esModuleInterop)。它是一个打字稿构造,在编写普通 JS 时不可用。

有没有办法使用 ESM import/export来存档此文件?

T.J*_*der 3

有没有办法使用 ESM 导入/导出来存档此文件?

不,不是在纯粹的标准 ESM 中,不是没有做你试图避免的事情:列出命名的导出。ESM中没有“休息”的概念import/export

a我想您知道这一点,但您可以导出具有、b和属性的对象c,但这与重新导出命名导出有很大不同。它不会是实时绑定,并且导入其部分的语法与导入命名导出不同(除非涉及 TypeScript 或捆绑器等构建时工具)。

FWIW,这就是它的样子(它与接近结尾的 TypeScript 版本非常相似),但我认为这不是你想要的:

reexport.js

import * as foo from "./foo.js";
import * as bar from "./bar.js";

const { b, ...restOfFoo } = foo;
export default {
    ...restOfFoo,
    ...bar,
};
Run Code Online (Sandbox Code Playgroud)

那么使用它就是:

// 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);
Run Code Online (Sandbox Code Playgroud)

这就是标准 ESM。