Куда смотреть при проблемах с производительностью приложения и типичные причины
Что проверяют
Есть ли у вас метод, а не набор заученных советов. Хороший ответ начинается с измерения и разделения слоёв, слабый сразу предлагает мемоизацию. Следом почти всегда просят пример: что тормозило у вас, как нашли причину и на сколько ускорили.
Как отвечать
Сначала измерения. Полевые данные (библиотека web-vitals, свой RUM, отчёт CrUX) отвечают, у кого и где болит, лабораторные (Lighthouse, вкладка Performance в DevTools) отвечают почему. Ориентиры: LCP до 2,5 с, INP до 200 мс, CLS до 0,1. Дальше разбирайте по слоям:
- доставка: вес бандла и отсутствие разбиения по маршрутам, неудалённый мёртвый код, отсутствие сжатия и кэш-заголовков, шрифты без
font-display: swap, картинки без AVIF или WebP и безsrcset, забытыеloading="lazy"иfetchpriority="high"на главной картинке экрана; - главный поток: задачи длиннее 50 мс, дорогая гидратация, сторонние скрипты вроде аналитики и чатов, синхронный разбор больших JSON. Лечится дроблением работы,
scheduler.yield()и выносом расчётов в Web Worker; - рендер: лишние перерисовки (видно в профайлере React), отсутствие виртуализации длинных списков, layout thrashing, когда чтение
offsetHeightчередуется с записью стилей, анимации не черезtransformиopacity, огромный DOM; - данные: водопад последовательных запросов, отсутствие кэша ответов, загрузка полей, которые не показываются;
- память: неснятые подписки и обработчики, растущие коллекции, отсоединённые узлы DOM видно в снимке кучи.
Закончите порядком работы: замер, гипотеза, одна правка, повторный замер и бюджет в CI, чтобы вес бандла не отрос обратно.
Где спотыкаются
Оптимизируют по ощущениям на своём быстром ноутбуке с локальным API. Включите throttling процессора и медленную сеть, картина меняется полностью.
Раскидывают memo и useMemo по всему коду. Сравнение пропсов и хранение значений тоже стоят времени, а причина обычно в одном тяжёлом компоненте или лишнем запросе.
Смотрят только Lighthouse на главной странице. Реальные пользователи заходят с телефонов на внутренние экраны, и полевые метрики оказываются заметно хуже лабораторных.