З 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
для виклику конкретних.