Производительность рендеринга

Общие (не React-специфичные) вопросы производительности: главный поток, отрисовка, метрики. React-специфичную оптимизацию см. в React: Performance.

Как выявить причины тормозов в интерфейсе?

Подход: сначала понять где теряется время (главный поток, сеть, рендер, композитинг), затем что его занимает.

ЭтапЧто смотретьТипичные причины
СубъективноЛаг при вводе, скролле, открытии модалкиLong tasks на main thread, лишние ре-рендеры, тяжёлый layout
Chrome PerformanceЗапись сессии → Main thread, Long Tasks (>50 ms), скриптинг vs Rendering vs PaintingТяжёлый JS, частые reflow, большие списки без виртуализации
Lighthouse / Web VitalsLCP, INP, CLSМедленный LCP — ресурсы/сервер; плохой INP — обработчики и main thread
СетьNetwork: waterfall, TTFB, размер чанковКрупный бандл, нет code splitting, медленный API

Практический чеклист:

  1. Воспроизвести сценарий с включённым Performance — найти длинные жёлтые блоки (скрипт) и фиолетовые (layout/paint).
  2. Проверить Layout thrashing: чтение геометрии (getBoundingClientRect, offsetWidth) в цикле после записи в DOM.
  3. Для списков — виртуализация; для тяжёлой работы — воркеры, разбиение задач.

Итог для собеса: тормоза чаще всего дают main thread (JS + layout/paint) и крупные/неоптимальные обновления DOM — диагностика = профилировщик + понимание, что именно блокирует кадр или ввод.


Основные метрики Web Vitals

МетрикаЧто измеряетХорошее значение
LCP (Largest Contentful Paint)Время отрисовки крупнейшего элемента≤ 2.5 с
INP (Interaction to Next Paint)Отзывчивость на действия пользователя≤ 200 мс
CLS (Cumulative Layout Shift)Визуальная стабильность (сдвиги layout)≤ 0.1
  • Плохой LCP — медленный сервер/ресурсы, большие изображения, рендер-блокирующий CSS/JS.
  • Плохой INP — тяжёлые обработчики, длинные задачи на main thread.
  • Плохой CLS — изображения/реклама без заданных размеров, поздняя вставка контента.

Чем отличаются атрибуты async и defer у <script>?

Оба позволяют загружать скрипт, не блокируя парсинг HTML, но по-разному влияют на порядок и момент выполнения.

asyncdefer
Загрузкапараллельно с парсингомпараллельно с парсингом
Момент выполнениясразу как скрипт загрузился (парсинг приостанавливается)после полного парсинга HTML, перед DOMContentLoaded
Порядок выполненияне гарантирован (кто раньше загрузился)в порядке подключения в разметке
  • async — для независимых скриптов (аналитика, счётчики), где порядок не важен.
  • defer — когда важен порядок выполнения и доступность готового DOM.

См. также