Асинхронные компоненты и lazy loading

↑ 4.1 Vue 3: основы, компоненты, Composition API · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Как уменьшить начальный бандл: код-сплиттинг компонентов и маршрутов.

Объяснение

import { defineAsyncComponent } from "vue";
 
const HeavyChart = defineAsyncComponent(() => import("./HeavyChart.vue"));
 
const AsyncModal = defineAsyncComponent({
  loader: () => import("./Modal.vue"),
  loadingComponent: Spinner,
  errorComponent: ErrorBlock,
  delay: 200,            // не показывать loading сразу
  timeout: 10_000,
  hydrate: hydrateOnVisible(),      // 3.5: ленивая гидратация (SSR)
});
// Маршруты: динамический import — отдельный чанк на страницу
const routes = [{ path: "/reports", component: () => import("@/pages/ReportsPage.vue") }];

Стратегии:

ЧтоКак
Маршруты() => import(...) (по умолчанию для всех страниц)
Тяжёлые компонентыdefineAsyncComponent (графики, редакторы, PDF)
Показ по условиюv-if + async-компонент — грузится при первом показе
Предзагрузкаimport() на hover/idle, <link rel="prefetch"> (/* webpackPrefetch: true */, Vite: modulepreload)
Тяжёлые библиотекидинамический import("lib") внутри обработчика
Ленивая гидратацияhydrateOnVisible, hydrateOnIdle (SSR)

Vite создаёт отдельные чанки по динамическим импортам; manualChunks группирует библиотеки (vendor).

Индикация загрузки: Suspense или loadingComponent, скелетоны; обработка ошибок загрузки чанка (обновление приложения: vite:preloadError → перезагрузка).

Нюансы и подводные камни

  • Слишком мелкие чанки увеличивают число запросов; слишком крупные — задержку.
  • После деплоя старые чанки исчезают: пользователи со старой вкладкой получают ошибку загрузки — обработайте.
  • Асинхронные компоненты внутри KeepAlive/Suspense требуют аккуратности.
  • Проверяйте состав бандла (rollup-plugin-visualizer).

Практика

  1. Сделайте маршруты ленивыми и посмотрите чанки в build.
  2. Загрузите график только при открытии вкладки.
  3. Настройте предзагрузку следующей страницы при наведении.

Вопросы с ответами

Связанные темы