如何在ES6中重新导出导入功能的修改列表

时间:2019-07-26 12:13:54

标签: javascript ecmascript-6 es6-modules

我想创建一个ES6模块,该模块从另一个模块导入所有功能,包装这些功能然后再次导出。听起来很简单,但我无法正常工作。

让我们从具有我要包装的功能的模块开始:

/* funcs.mjs */
export function foo() { return "foo"; };
export function bar() { return "bar"; };
// A lot of more functions following...

这是一个测试脚本,它导入并执行另一个模块中许多假设功能中的两个:

/* test.mjs */
import { foo, bar } from "./funcs.mjs";

console.log(foo());
console.log(bar());

我现在想编写一个包装器模块,从funcs.mjs导入所有功能,将它们包装为新功能,并以原始功能名称导出这些新功能。因此,最后,我希望能够将test.mjs中的导入模块名称从funcs.mjs更改为wrapped-funcs.mjs,然后在不更改其他任何内容的情况下,该脚本必须仍然有效,现在调用包装的函数

我遇到的问题是我无法弄清楚如何导出包装的函数,因此无法像导入原始函数一样导入它们:

/* wrapped-funcs.mjs */
import * as funcs from "./funcs.mjs";

const wrapped = Object.entries(funcs).reduce((wrapped, [ name, func ]) => {
    wrapped[name] = () => "wrapped " + func();
    return wrapped;
}, {});

// export wrapped;                     // Invalid
// export { ...wrapped };              // Invalid
// export { wrapped }                  // Not what I want (Exports object with name "wrapped")
// export default wrapped;             // Not what I want (Exports object with name "default")
export const { foo, bar } = wrapped;   // Exports correctly but I have to specify all functions manually

使用export { wrapped }export default wrapped导出所有函数,但是模块接口与我想要的不同,因此无法正常工作。使用export const { foo, bar } = wrapped可以正确构造导出,但是此解决方案存在一个问题,即我必须知道包装器模块中的所有函数名称。所以那也不行。

ES6模块还有其他巧妙的方法吗?我知道可以用CommonJS来完成,但这不在本文范围之内。

0 个答案:

没有答案