PassFront
  1. PassFront
  2. База знаний
  3. Рендеринг и производительность

Что такое React.lazy?

Рендеринг и производительность

React.lazy — функция для ленивой загрузки компонента: его код выделяется в отдельный чанк и скачивается только при первом рендере.

Использование

import { lazy, Suspense } from 'react';

const ReportPage = lazy(() => import('./ReportPage'));

const App = () => (
  <Suspense fallback={<PageSkeleton />}>
    <ReportPage />  {/* чанк грузится при первом показе */}
  </Suspense>
);
  • Принимает функцию, возвращающую динамический import(); модуль должен иметь default export с компонентом.
  • Пока чанк грузится, ближайший <Suspense> показывает fallback — без него будет ошибка.

Какую проблему решает

Без code splitting весь код приложения попадает в один бандл: пользователь ждёт загрузку страницы отчётов, даже если пришёл на логин. React.lazy + динамический import заставляют сборщик (Vite/webpack) выделить отдельные чанки и грузить их по требованию — быстрее первая отрисовка.

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

  • По маршрутам — главный кейс: каждая страница своим чанком.
  • Тяжёлые редко используемые виджеты: редакторы, графики, PDF-просмотр.
  • Модалки и панели, которые открываются не всегда.

Нюансы

  • Ошибка загрузки чанка (сеть, новый деплой) — ловится Error Boundary; полезно предусмотреть retry.
  • Не стоит дробить всё подряд: слишком много мелких чанков — лишние сетевые раунды. Осмысленно — маршруты и действительно тяжёлые блоки.
  • Прелоад: можно заранее вызвать import('./ReportPage') при наведении на ссылку.
  • Именованные экспорты требуют обёртки: lazy(() => import('./m').then((m) => ({ default: m.Report }))).

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

React.lazy оборачивает динамический import() и делает компонент лениво загружаемым отдельным чанком; во время загрузки Suspense показывает fallback. Основное применение — code splitting по маршрутам и тяжёлым виджетам, чтобы ускорить первую загрузку. Ошибки чанков ловят Error Boundary.

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