NodeJS中如何把导入的模块功能封装为对象调用?
为什么import acts from 'actions'会报错?
你遇到的TypeError: Cannot read properties of undefined (reading 'paint')错误,核心原因是**actions模块只有命名导出,没有默认导出**。
当你用import acts from 'actions'时,是在尝试导入模块的default导出项,但actions模块仅通过export {paint, work, drink}暴露了三个命名导出成员,并没有定义默认导出。此时acts的值为undefined,自然无法读取它的属性。
为什么你的arqeo库可以用默认导入?
你的arqeo库能正常运行,是因为它的模块代码里定义了默认导出,并且把is、are等方法挂载在了默认导出的对象上。比如库的源码里可能有类似这样的代码:
export default { is, are, has, catalog, apply, pick, curate }
所以当你import aqo from "arqeo"时,aqo就是这个包含所有方法的对象,解构操作自然能拿到对应的方法。
你的猜想完全正确:import * as acts from "actions"是可行的
import * as acts from "actions"这种语法会把模块中所有的命名导出成员,统一收集到acts对象中。此时acts会包含paint、work、drink三个方法,你可以正常调用acts.drink()、acts.work()、acts.paint()。
额外可选方案
如果你更习惯默认导入的写法,且有权修改actions模块的代码,可以给它添加默认导出:
// 在actions模块中添加 export { paint, work, drink }; // 新增默认导出 export default { paint, work, drink };
之后就能用import acts from 'actions'正常调用方法了。但如果actions是第三方模块无法修改源码,那么import * as acts就是最优解。
内容的提问来源于stack exchange,提问作者Bruno Peixoto

