react-patterns
Паттерны React
Ты уже умеешь писать на React — теперь освой паттерны уровня senior: композицию, архитектуру состояния, границу сервер/клиент, Suspense и антипаттерны, от которых нужно избавляться, чтобы компоненты оставались простыми по мере роста.
Начать трек → 00
Начни отсюда
Паттерн React — это именованное переиспользуемое решение повторяющейся задачи проектирования компонентов, и все они происходят из UI = f(state). Трек предполагает знание основ React и учит паттернам — вместе с их режимами отказа, — которые держат компоненты простыми по мере роста приложения. 01
Композиция
Компоненты соединяются композицией, а не наследованием: children и слоты инвертируют управление, и родитель поставляет содержимое, а компонент — структуру. Проброс пропсов нормален на пару уровней — тянись к большему, только когда он реально мешает. 02
Compound-компоненты
Compound-компоненты разделяют неявное состояние через приватный контекст, давая потребителю свободу раскладки, пока родитель владеет поведением. Поддерживай и управляемый, и неуправляемый режимы и применяй паттерн к переиспользуемым виджетам, а не к фиксированным одноразовым. 03
Render-props и headless
Render-props и headless-компоненты отделяют поведение от представления; кастомный хук — их современный наследник для переиспользования логики: ты получаешь состояние, обработчики и доступность, а разметку поставляешь сам. 04
Кастомные хуки
Кастомный хук именует и изолирует кусок состояния и логики для переиспользования и тестов — извлекай при реальном дублировании или ясной концепции, проектируй его зависимости и очистку как контракт и не извлекай обёртку с единственным вызовом. 05
Колокация и подъём состояния
Держи состояние так низко, как можно, и поднимай только при реальном совместном использовании; вычисляй то, что можешь, вместо хранения; а разделяемое навигационное состояние держи в URL. 06
Контекст по уму
Контекст подходит для редко меняющегося, широко читаемого состояния; дроби толстые контексты и отделяй state от dispatch, чтобы сузить радиус перерисовок; сочетай его с редьюсером для сквозного состояния с реальными переходами. 07
Внешнее состояние и сторы
Тянись к внешнему стору, только когда подъём и контекст перестают масштабироваться; используй селекторы, чтобы подписаться лишь на нужный срез (и избегай tearing), и useSyncExternalStore, чтобы безопасно подключить любой внешний источник. 08
Эффекты с дисциплиной
useEffect — для синхронизации с внешними системами, а не для реакции на состояние; большинство эффектов можно удалить (вычисляй вместо них), а каждый оставшийся обязан очищаться и избегать устаревших замыканий. 09
Производительность рендеринга
Не мемоизируй по умолчанию — сначала профилируй; memo, useMemo и useCallback помогают только как система, а стабильные уникальные ключи предотвращают и лишние рендеры, и порчу состояния. 10
Граница сервер/клиент
Серверные компоненты — по умолчанию; опускай 'use client' к интерактивным листьям, передавай через границу только сериализуемые пропсы и держи доступ к данным и секреты только на сервере. 11
Suspense и границы
Размещай Suspense близко к месту, где нужны данные, и сопровождай каждую границу границей ошибок; используй переходы и отложенные значения, чтобы UI оставался отзывчивым при тяжёлых обновлениях. 12
Формы и actions
По умолчанию — неуправляемые поля с FormData, а управляй только когда значение влияет на UI; form actions React 19 вместе с useActionState обрабатывают ожидание и ошибки, а useOptimistic делает мутации мгновенными на вид. 13
Паттерны загрузки данных
Загружай на сервере (RSC) для начальных данных и бери query-библиотеку, когда нужны клиентский кеш, дедупликация и мутации; никогда не копируй серверное состояние в клиентское и загружай независимые данные параллельно. 14
Антипаттерны React
Божественные компоненты, проброс пропсов, эффекты-зеркала вычисляемого состояния, злоупотребление контекстом и ключи-индексы — это антипаттерны React; лечи каждый подходящим паттерном, не перегибая в глобальный стор или случайные ключи. 15
Капстоун: рефакторинг React-фичи
Собери всё на запутанной React-фиче: инвентаризируй запахи паттернов, рефактори пошагово, применяя композицию, хуки, состояние и границы, и измерь, что перерисовок стало меньше, а следующее изменение стало локальным.Git: от нуля до сеньора
Начни, ни разу не запустив `git init`. Закончи, умея ветвиться, делать rebase, восстанавливать потерянную работу, переписывать историю — включая смену автора коммита — и вести рабочий процесс ветвления, на котором катит настоящая команда.