← Заметки
Чек-лист производительности React, которым я правда пользуюсь
Большая часть советов по производительности React либо слишком абстрактна, чтобы что-то с ней сделать, либо слишком заточена под чужой конкретный баг. Вот список, который я реально прогоняю перед тем, как считать экран готовым — именно в этом порядке, потому что порядок важен: первые два пункта ловят большинство проблем, а остальные — на случай, если не поймали.
- Сначала профилировать, потом трогать код. Открыть профайлер React DevTools, записать то самое взаимодействие, которое кажется медленным, и посмотреть, какие компоненты перерендерились и почему. Угадывание, какой компонент тормозит, съедает больше времени, чем сам последующий фикс.
- Проверить, сколько элементов списка перерендеривается. Если список из 200 строк перерисовывается целиком на каждое нажатие клавиши в никак не связанном поле фильтра, значит состояние, скорее всего, лежит слишком высоко по дереву. Опустить состояние поля вниз или поднять состояние списка выше поля — обычно чинит это одним движением.
- Искать объекты и массивы, создаваемые прямо в рендере.
style={{ margin: 8 }}илиoptions={[...]}, написанные инлайном, создают новую ссылку на каждый рендер, что незаметно убиваетmemoу того, кто получает это пропсом. Вынести литерал наружу или обернуть вuseMemoстоит одну строку кода. - Убедиться, что ключи стабильны, а не индексы. Ключ-индекс выглядит нормально ровно до первой вставки или удаления строки, после чего React переиспользует не тот DOM-узел, и локальное состояние — открытый дропдаун, сфокусированный инпут — прыгает не на ту строку. Перед каждым релизом я грепаю
key={i}. - Проверить, что попало в стартовый JS-бандл. Модалка, библиотека графиков или редактор форматированного текста, импортированные в начале файла роута, уезжают всем, кто заходит на страницу, даже тем 5%, кто эту модалку никогда не откроет.
next/dynamicсssr: falseдля всего, что скрыто за кликом, чинится за пару минут и обычно оказывается самым весомым пунктом в списке. - Измерять на реальных данных, а не предполагать. Пятьдесят строк в деве ведут себя совсем не так, как пять тысяч у настоящего клиента. У меня специально для этой проверки есть один засеянный датасет реалистичного размера, потому что «во время разработки казалось быстрым» — это не бенчмарк.
Ничего экзотического в этом списке нет. Он работает именно потому, что скучный и повторяемый — я прогоняю его одинаково каждый раз, вместо того чтобы рефлекторно хвататься за memo и надеяться на лучшее.