PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Зачем нужен defineAsyncComponent?

Асинхронность и Event Loop

`defineAsyncComponent` (Vue) нужен для ленивой загрузки компонентов — компонент загружается только когда действительно рендерится, что уменьшает начальный бандл.

Что делает

Определяет компонент, который загружается асинхронно (по требованию), а не сразу при загрузке приложения:

import { defineAsyncComponent } from 'vue';

const AsyncModal = defineAsyncComponent(() =>
  import('./HeavyModal.vue') // загрузится, только когда компонент понадобится
);

Зачем нужен

  • Уменьшение начального бандла — код компонента в отдельном чанке, грузится по требованию.
  • Быстрый первый показ — не грузим редкие/тяжёлые компоненты сразу.
  • Code splitting — бандлер создаёт отдельный чанк для async-компонента.

Расширенные опции

const AsyncComp = defineAsyncComponent({
  loader: () => import('./Comp.vue'),
  loadingComponent: Spinner,   // пока грузится
  errorComponent: ErrorView,   // при ошибке загрузки
  delay: 200,                  // задержка перед показом loading
  timeout: 5000,               // таймаут загрузки
});

Где применять

  • Тяжёлые компоненты (графики, редакторы).
  • Редко используемые (модалки, диалоги).
  • Компоненты маршрутов (в связке с роутером).

Аналог в React

React.lazy(() => import(...)) + Suspense.

Коротко для собеседования

defineAsyncComponent (Vue) лениво загружает компонент — только когда он рендерится, уменьшая начальный бандл (code splitting). Поддерживает loadingComponent, errorComponent, delay, timeout. Для тяжёлых/редких компонентов (модалки, графики). Аналог React.lazy + Suspense в React.

Другие вопросы раздела