Статичний import завантажує модуль одразу разом з тим, хто його імпортує. Динамічний import(path) - це функція-вираз, що завантажує модуль на вимогу і повертає Promise з об'єктом модуля:
button.addEventListener('click', async () => {
const { default: Chart } = await import('chart.js/auto');
new Chart(canvas, config);
});
Бібліотека графіків (сотні кілобайтів) завантажиться, лише коли користувач натисне кнопку.
Розділення коду (code splitting). Збирач бачить import() і виносить модуль з його залежностями в окремий файл. Головний бандл стає меншим - сторінка швидше стає інтерактивною.
Типові застосування:
- маршрути SPA - кожна сторінка своїм файлом:
const routes = [
{ path: '/reports', component: () => import('./pages/Reports.vue') },
];
- важкі віджети - редактори тексту, карти, графіки, PDF-переглядачі;
- рідко потрібні функції - експорт у Excel, модальні вікна налаштувань;
- локалізація - завантажити лише потрібну мову:
await import(`./locales/${lang}.json`); - поліфіли лише для браузерів, яким вони потрібні.
Особливості:
- шаблонний шлях (
`./locales/${lang}.js`) збирач обробляє, лише якщо частину шляху відомо: він створить окремий файл для кожного відповідного модуля в папці. Повністю динамічний шлях (import(userInput)) зібрати неможливо. У Vite для таких випадків -import.meta.glob; - експорт за замовчуванням приходить як властивість
default; - помилки мережі: динамічний імпорт може не вдатися (офлайн, або після деплою старий файл зник з сервера). Потрібна обробка: повідомлення, повторна спроба, перезавантаження сторінки. Vite у такому разі генерує подію
vite:preloadError; - кешування: модуль завантажується один раз; повторні
import()повертають той самий екземпляр.
Попереднє завантаження. Щоб користувач не чекав на мережу після кліку, частини можна завантажити заздалегідь - при наведенні на посилання чи в простої: <link rel="modulepreload">. Vite сам додає попереднє завантаження залежностей для частин, що імпортуються динамічно.
Не варто дробити надто сильно: десятки дрібних частин - це десятки запитів і затримка «водоспадом», коли одна частина імпортує іншу. Розділяють за межами використання (маршрут, функція), а не кожен компонент окремо.