Lazy loading маршрутов
↑ 5.1 Vue Router · ← Предыдущая · → Следующая
Зачем это на собесе
Как уменьшить начальный бандл и что происходит при ошибке загрузки чанка.
Объяснение
Динамический import() создаёт отдельный чанк для страницы, загружаемый при первом переходе.
const routes = [
{ path: "/", component: HomePage }, // критичные — сразу
{ path: "/reports", component: () => import("@/pages/ReportsPage.vue") }, // ленивый чанк
{ path: "/admin", component: () => import(/* webpackChunkName: "admin" */ "@/pages/AdminPage.vue") },
];Vite (Rollup) сам делит код; управление:
// vite.config.ts
build: { rollupOptions: { output: { manualChunks: { vendor: ["vue", "vue-router", "pinia"], charts: ["echarts"] } } } }Оптимизации:
| Приём | Эффект |
|---|---|
| Ленивые страницы | меньше начальный JS |
Предзагрузка (prefetch/modulepreload) | быстрее следующий переход |
Предзагрузка по hover/видимости RouterLink | загрузка до клика |
| Группировка чанков | меньше запросов |
| Анализ бандла | rollup-plugin-visualizer |
Ошибка загрузки чанка после деплоя (старый чанк удалён):
router.onError((err, to) => {
if (/Failed to fetch dynamically imported module|Importing a module script failed/.test(err.message)) location.assign(to.fullPath); // жёсткая перезагрузка
});
window.addEventListener("vite:preloadError", () => location.reload());Индикатор загрузки: глобальный прогресс-бар в beforeEach/afterEach, Suspense, скелетоны.
Нюансы и подводные камни
- Слишком мелкие чанки → много запросов; слишком крупные → замедление.
- Не оборачивайте
defineAsyncComponentвокруг роут-компонентов: роутер уже поддерживает ленивую загрузку. - Кэширование чанков: имена с хэшем содержимого;
index.htmlне кэшируйте долго. - Загрузка на медленной сети: предзагрузка критичных страниц.
Практика
- Сделайте все страницы ленивыми и посмотрите чанки в
dist. - Добавьте прогресс-бар при навигации.
- Обработайте ошибку загрузки чанка перезагрузкой.
Вопросы с ответами
Как реализовать lazy loading маршрутов?
component: () => import("./Page.vue")— отдельный чанк подгружается при первом переходе.
Что делать, если после деплоя чанк не найден?
Перехватить ошибку динамического импорта и перезагрузить страницу.