javascript - 如何在 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.mjs
从funcs.mjs
to更改为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 来完成,但这超出了这里的范围。
解决方案
推荐阅读
- verilog - 增量循环模拟,当灵敏度列表中的两个输入同时变化并且逻辑以这两个输入为条件时会发生什么
- html - Css Tricks,SearchBar 跟随水平 2 色背景
- javascript - Paypal Checkout 集成 - onShippingChange 不适用于新 SDK
- javascript - Graphlib-dot 解析器的问题
- spring-boot - 如何在 Spring Boot 中更改 thymeleaf 静态内容默认路径
- python - Scipy优化使用数据框最小化
- javascript - 如果函数:多个必需条件 - 继续或停止节点继续执行函数
- java - 我需要 JRE_HOME 吗?Tomcat java环境版本差异
- matrix - Inv() 与 JULIA 上的 '\'
- javascript - 将区域js变量映射到输入中的php