自 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) => {
// Use the module the way you want, as:
module.hi('Erick') // Named export
module.bye('Erick') // Named export
module.default() // Default export
})
}
但由于返回的是 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')
或者也许可以获取这些命名导出之一并将其重命名为我们想要的任何其他内容:
const { hi: hello } = await import('./something.js')
hello('Erick')
或者甚至将默认导出的函数重命名为更有意义的名称:
const { default: helloWorld } = await import('./something.js')
helloWorld()
最后(但并非最不重要)注意: import()
可能看起来像一个函数调用,但它不是Function
. 这是一种恰好使用括号的特殊语法(类似于 发生的情况super()
)。所以不可能分配import
给变量或使用Function
原型的东西,比如call
/ apply
。