自2016年以来,JavaScript世界已经过去了很多,所以我认为是时候提供有关该主题的最新信息。目前动态进口是一个现实都在节点和浏览器上(本地,如果你不关心IE浏览器,或@巴贝尔/插件语法动态导入,如果你做护理)。
因此,请考虑一个something.js
具有两个命名导出和一个默认导出的示例模块:
export const hi = (name) => console.log(`Hi, ${name}!`)
export const bye = (name) => console.log(`Bye, ${name}!`)
export default () => console.log('Hello World!')
我们可以使用import()
语法轻松,干净地有条件地加载它:
if (somethingIsTrue) {
import('./something.js').then((module) => {
module.hi('Erick')
module.bye('Erick')
module.default()
})
}
但由于返回值为a Promise
,所以async
/await
语法糖也是可能的:
async imAsyncFunction () {
if (somethingIsTrue) {
const module = await import('./something.js')
module.hi('Erick')
}
}
现在考虑一下对象解构分配的可能性!例如,我们能够轻松地将命名出口中的一个出口存储在内存中以供后用:
const { bye } = await import('./something.js')
bye('Erick')
或者,可以选择其中一个名为exports的名称,然后将其重命名为我们想要的其他任何名称:
const { hi: hello } = await import('./something.js')
hello('Erick')
甚至将默认的导出函数重命名为更有意义的名称:
const { default: helloWorld } = await import('./something.js')
helloWorld()
只是最后(但并非最不重要)的注意事项: import()
看起来像函数调用,但不是Function
。这是一种特殊的语法,只是碰巧使用了括号(类似于发生的情况super()
)。因此,不可能分配import
给变量或使用Function
原型中的东西,例如call
/ apply
。
super
致电特定。