С 2016 года в мире JavaScript многое изменилось, поэтому я считаю, что пора предложить самую свежую информацию по этой теме. В настоящее время динамический импорт возможен как в Node, так и в браузерах (изначально, если вам не важен IE, или с помощью @ babel / plugin-syntax-dynamic-import, если вам все равно).
Итак, рассмотрим образец модуля 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()
})
}
Но так как возвращение является 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
.
super
для вызова конкретного.