能否将模块的导出内容直接导入到对象中以避免命名前缀?
实现
x.foo/y.bar式导入:无多余变量,只取所需成员 嘿,刚好能解决你的需求!你想要的这种不用前缀别名、直接用对象调用成员的写法完全能实现,既不用导入模块全部内容,也不会产生xFoo这类多余变量。给你两种非常贴合场景的方案:
方案一:针对单个导出文件(像你补充的widgetX/foo这种场景)
如果你的foo和bar是单独文件导出的默认成员,直接用顶层await+对象字面量就能一步封装,完全没有中间变量:
// 直接把需要的成员封装到x、y对象里 const x = { foo: (await import("widgetX/foo")).default, bar: (await import("widgetX/bar")).default }; const y = { foo: (await import("widgetY/foo")).default, bar: (await import("widgetY/bar")).default };
要是你的环境不支持顶层await(比如旧版Node.js或者未配置的打包工具),把这段代码放到一个async函数里执行就行:
async function initWidgets() { const x = { foo: (await import("widgetX/foo")).default, bar: (await import("widgetX/bar")).default }; const y = { foo: (await import("widgetY/foo")).default, bar: (await import("widgetY/bar")).default }; // 在这里使用x和y } initWidgets();
方案二:针对多成员导出的模块(像你最初的widgetX模块场景)
如果widgetX是一个包含foo和bar命名导出的模块,用解构赋值+动态导入就能直接把指定成员挂载到自定义对象上,同样没有多余变量:
const x = {}; const y = {}; // 注意解构外面的括号不能丢,否则会被解析成代码块 ({ foo: x.foo, bar: x.bar } = await import("widgetX")); ({ foo: y.foo, bar: y.bar } = await import("widgetY"));
之后你直接用x.foo()或者y.bar()调用就行,完全符合你的预期。
为什么这两种方案适合你?
- 只导入了你需要的
foo和bar,没有加载模块的其他冗余内容 - 不用再写
xFoo、yBar这类容易混淆的前缀,代码更清晰 - 全程没有多余的中间变量,写法简洁直接
内容的提问来源于stack exchange,提问作者drs9222
相关产品推荐
相关产品推荐

