我想创建一个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来完成,但这不在本文范围之内。