Code splitting и lazy loading
↑ 7.2 Рендеринг и производительность · ← Предыдущая · → Следующая
Зачем это на собесе
Уменьшение начального JS — главный рычаг быстрой загрузки SPA.
Идея
Не отдавать весь код сразу: разбить на чанки и подгружать по необходимости.
Способы
// маршруты
const routes = [
{ path: '/reports', component: () => import('./pages/ReportsPage.vue') },
]
// компоненты
const Editor = defineAsyncComponent({
loader: () => import('./Editor.vue'),
loadingComponent: Spinner,
delay: 200,
})
// библиотеки по требованию
async function exportXlsx() {
const { utils, writeFile } = await import('xlsx')
}Vite / Rollup
build: {
rollupOptions: {
output: {
manualChunks: { vendor: ['vue', 'vue-router', 'pinia'] },
},
},
}Стратегии предзагрузки
<link rel="prefetch">— на простое время браузера;import(/* webpackPrefetch: true */ ...)(Webpack), в Vite — автоматическийmodulepreload;- prefetch по hover ссылки или при появлении в viewport (
IntersectionObserver).
Нюансы
- слишком много мелких чанков дают лишние запросы (HTTP/2 смягчает);
- общие зависимости выносятся в shared chunk автоматически;
- показывать skeleton, обрабатывать ошибку загрузки чанка (сеть, устаревший деплой);
- разделять по маршрутам в первую очередь.
Вопросы с ответами
С чего начать уменьшение бандла?
Разделить по маршрутам, вынести тяжёлые библиотеки (графики, редакторы) в динамический импорт, проверить визуализатором состав бандла.
Что делать при ошибке загрузки чанка после деплоя?
Ловить ошибку динамического импорта и перезагружать страницу, хранить старые ассеты на CDN.