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来存档此文件?
有没有办法使用 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。
| 归档时间: |
|
| 查看次数: |
3161 次 |
| 最近记录: |