首页 > 解决方案 > 如何在 ES6 中重新导出修改后的导入函数列表

问题描述

我想创建一个 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.mjsfuncs.mjsto更改为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 来完成,但这超出了这里的范围。

标签: javascriptecmascript-6es6-modules

解决方案


推荐阅读