React·100 вопросов

Как работает React.lazy и code splitting?

Ответ

Функция React.lazy совместно с механизмом code splitting решает одну из главных проблем крупных клиентских приложений — снижение времени первоначальной загрузки страницы. Если пользователь заходит на главную страницу сайта, ему абсолютно не нужно скачивать JavaScript-код административной панели или тяжелых модальных окон, которые могут вообще не понадобиться за всю сессию. Разделение кода позволяет нарезать итоговый бандл на небольшие логические части и отдавать их браузеру строго по требованию.

Для реализации этого подхода компонент оборачивается в вызов React.lazy, который принимает функцию с динамическим импортом. Поскольку этот импорт является асинхронным, React во время рендеринга сталкивается с ожиданием и требует наличия родительского элемента с fallback-состоянием. Таким образом, React.lazy неразрывно связан с компонентом Suspense, который отображает индикатор загрузки в момент скачивания нужного модуля из сети.

Грамотное проектирование точек разделения кода требует баланса. Чаще всего код делят по страницам или крупным маршрутам приложения с помощью роутера. Реже разделяют изолированные тяжелые виджеты, графики или редакторы кода, которые открываются по явному клику пользователя. При этом нельзя дробить приложение на слишком мелкие части, так как это приведет к лавинообразному росту HTTP-запросов за мелкими файлами, что ухудшит общую производительность сети.

Для контроля над размером и структурой получаемых чанков разработчики используют специальные инструменты анализа сборки. Анализаторы бандлов визуально показывают, какие библиотеки и модули занимают больше всего места в итоговых файлах. Это помогает вовремя обнаружить дублирование кода или случайное включение тяжелых зависимостей в начальный чандл приложения.

Рекомендации по использованию React.lazy и code splitting:

Используй React.lazy для динамической загрузки компонентов, возвращающих Promise с ES-модулем.
Всегда оборачивай ленивые компоненты в конструкцию с <Suspense fallback> для отображения заглушки на время скачивания.
Проводи разделение кода по логическим роутам или автономным тяжелым виджетам интерфейса.
Избегай чрезмерного дробления на слишком мелкие чанки, чтобы не перегружать сетевую инфраструктуру лишними запросами.
Регулярно запускай инструменты анализа сборки (bundle analyzer) для контроля размеров файлов и оптимизации структуры проекта.
Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем