Вышел React 19.3.1 — что принёс React 19.3
14 октября вышел React 19.3.1 — сейчас это latest на npm. Патч крошечный: одно изменение в React Server Components, улучшен транспортный протокол (тот же фикс бэкпортировали в 19.2.9, 19.1.10 и 19.0.9). Зато это повод собрать в одном месте, что принёс React 19.3 от 9 сентября — релиз крупнее, чем кажется по номеру.
1. View Transitions — стабильно <ViewTransition> анимирует появление, исчезновение и перемещение элементов через нативный View Transition API. Анимируются только несрочные обновления: startTransition, раскрытие Suspense, useDeferredValue; срочные идут без анимации. addTransitionType('next') позволяет один и тот же стейт анимировать по-разному в зависимости от причины — карусель вперёд и назад. Пока только DOM.
2. Fragment Refs — стабильно ref на <Fragment> даёт DOM-методы над группой соседних узлов без обёртки-div и без forwardRef в детях: focus/blur, addEventListener, observeUsing для IntersectionObserver и ResizeObserver, scrollIntoView, getClientRects. Для UI-китов и компонентов-обёрток — то, чего давно не хватало.
3. use(browser()) в react-dom Декларативный способ отключить SSR для компонента. На сервере он suspend-ится, и в HTML уходит fallback ближайшего Suspense; в браузере рендерится как обычно. Заменяет typeof window и флаг mounted в useEffect, которые регулярно давали hydration mismatch. Так как use можно вызывать условно, SSR можно отключать только когда нет initialData. Для серверных API добавлен onBrowserBailout — логировать, где SSR пропущен.
4. Trusted Types Раньше React приводил все значения к строке и ломал TrustedHTML, TrustedScript и TrustedScriptURL. Теперь пропускает их как есть, и CSP с require-trusted-types-for 'script' работает без костылей.
5. Context прямо в Server Components Контекст из 'use client' модуля можно рендерить в серверном компоненте без отдельного Provider-обёртки: <UserContext value={user}> прямо в async Layout.
6. Transitions рендерятся независимо Медленный transition больше не тянет за собой остальные — раньше они сливались в один рендер.
Из мелочей: двойной вызов эффектов в Strict Mode теперь и при гидратации, предупреждение при неправильном условном use, submitter в submit-событиях. И репозиторий теперь живёт в github.com/react/react — facebook/react редиректит туда.
Что делать: — обновиться до 19.3.1, патчи для старых линий тоже вышли; — если есть SSR и компоненты с typeof window — попробовать use(browser()); — простые анимации переходов между экранами — кандидат на ViewTransition вместо тяжёлых библиотек.
Примеры кода — на картинках. Полный changelog: react.dev/blog