Проблема полной гидратации
Измерьте стоимость гидратации целого React SPA и разберитесь, почему статическим страницам она не нужна
«Проблема полной гидратации» — бесплатный урок React Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Что такое гидратация
Гидратация — это процесс, при котором React берёт HTML, сформированный сервером, и добавляет к нему обработчики событий JavaScript. Сервер отправляет начальный HTML (быстро), затем браузер загружает пакет JavaScript, а React выполняет гидратацию статического HTML, делая его интерактивным. До завершения гидратации страница выглядит интерактивной, но таковой не является.
Стоимость гидратации традиционного SPA
Традиционное одностраничное приложение отправляет браузеру весь пакет JavaScript. React должен загрузить, разобрать и выполнить его, а затем добавить обработчики событий каждому компоненту в дереве. В крупных приложениях этот процесс может занимать несколько секунд на мобильных устройствах среднего класса.
Время до интерактивности (TTI)
Время до интерактивности показывает, сколько времени проходит до того, как пользователь сможет взаимодействовать со страницей. Гидратация непосредственно ограничивает TTI: страница может выглядеть готовой, поскольку HTML, сформированный сервером, уже виден, но кнопки и формы не реагируют, пока React не завершит добавление обработчиков событий. Высокое значение TTI означает плохой пользовательский опыт.
Парадокс статического содержимого
Рассмотрим маркетинговую страницу: 80% содержимого — это неизменяющиеся статические тексты, изображения и заголовки. Только 20% приходится на интерактивные элементы, такие как форма подписки на новости или видеопроигрыватель. При традиционной гидратации SPA обработка всё равно выполняется для 100% страницы, из-за чего статические компоненты обрабатываются без необходимости.
Измерение затрат на гидратацию
Профилирование производительности в Chrome DevTools показывает затраты на гидратацию. На диаграмме загрузки основного потока можно определить задачу «гидратация React» как длительный блок выполнения JavaScript после первой отрисовки. Чем дольше этот блок, тем сильнее занят основной поток и тем ниже отзывчивость страницы.
Размер дерева компонентов имеет значение
Чем больше дерево компонентов React, тем больше работы требует гидратация. React должен посетить каждый компонент, сравнить HTML, сформированный сервером, с тем, что отрисовал бы компонент, и добавить обработчики событий. У сложной страницы с сотнями компонентов накладные расходы на гидратацию могут быть заметны даже на быстрых устройствах.
Конкурентная гидратация в React 18
В React 18 появилась конкурентная гидратация, которая позволяет React разбивать гидратацию на небольшие части и передавать управление браузеру между ними. Благодаря этому браузер не выглядит полностью зависшим во время гидратации больших деревьев. Однако конкурентная гидратация лишь смягчает последствия — она не устраняет фундаментальные затраты.
Выборочная гидратация в React 18
Выборочная гидратация (с помощью Suspense) позволяет React выполнять гидратацию компонентов в порядке приоритета: действия пользователя вызывают немедленную гидратацию соответствующего компонента. Это повышает отзывчивость, но всё ещё происходит внутри единого дерева React: со временем гидратацию проходят все компоненты дерева.
Ключевой вывод
Главный вывод, лежащий в основе архитектуры островов, заключается в том, что большей части обычной страницы вообще не нужен JavaScript. Панели навигации, основные секции, ссылки в нижнем колонтитуле, текст записи блога и описания товаров служат только для отображения. Принудительная гидратация этих элементов по определению неэффективна.
Влияние на практике
Исследования команд, занимающихся производительностью веб-приложений, показывают, что разбор и выполнение JavaScript — главная статья затрат на мобильных устройствах. Пакету JavaScript размером 300 КБ требуется 2–3 секунды для разбора на среднестатистическом телефоне Android. Уменьшение объёма JavaScript, отправляемого браузеру, даёт непропорционально большие преимущества по производительности по сравнению с любой оптимизацией внутри React.
Налог на гидратацию
Каждый килобайт кода JavaScript, добавленный в приложение React, увеличивает объём работы при гидратации. Даже если компонент служит только для оформления, он участвует в гидратации, если находится в дереве React. Этот «налог на гидратацию» растёт вместе с размером приложения, поэтому по мере его развития становится всё сложнее поддерживать хорошие показатели TTI.
TTI и гидратация
Как связаны гидратация React и время до интерактивности (TTI)?
Итоги урока
Традиционная гидратация React обрабатывает всё дерево компонентов, включая статическое содержимое, которому JavaScript не нужен. Это блокирует время до интерактивности и плохо масштабируется с ростом приложения. Улучшения React 18 — конкурентная и выборочная гидратация — уменьшают влияние проблемы, но не устраняют фундаментальные затраты. Главный вывод: большей части содержимого страницы просто не нужен JavaScript, поэтому полная гидратация неэффективна.
Часто задаваемые вопросы
Урок «Проблема полной гидратации» бесплатный?
Да — полный текст урока «Проблема полной гидратации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Проблема полной гидратации»?
Измерьте стоимость гидратации целого React SPA и разберитесь, почему статическим страницам она не нужна Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Проблема полной гидратации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проблема полной гидратации
- Архитектура островов: выборочная гидратация
- Настройка Astro и островов React
- Измерение производительности: Lighthouse и основные веб-показатели