Потоковая SSR с периферии
Передавайте HTML-вывод React через ReadableStream, чтобы браузер мог немедленно отобразить содержимое, важное для пользователя
«Потоковая SSR с периферии» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Преимущество потоковой передачи
Когда сервер передаёт HTML потоково, браузер получает и отображает контент фрагментами, не дожидаясь полного документа. Пользователи могут видеть и использовать уже отображённые части страницы — шапку, навигацию и главный экран, — пока более медленные разделы, зависящие от данных, ещё загружаются.
renderToReadableStream с bootstrapScripts
Передача bootstrapScripts в renderToReadableStream сообщает React, где находится клиентский пакет JS. React добавляет тег script в конце потока, чтобы браузер загрузил пакет и вызвал hydrateRoot, делая страницу интерактивной по мере потоковой передачи каждого раздела.
Границы Suspense в дереве
Потоковая передача в React опирается на границы Suspense, разделяющие дерево компонентов на независимо передаваемые потоком разделы. Компоненты внутри границы Suspense, ожидающие данные (через выброшенный Promise), сначала передаются как заполнители, а затем разрешаются и позже передают своё настоящее содержимое.
onShellReady: когда начинать потоковую передачу
Обратный вызов onShellReady срабатывает, когда HTML-оболочка без приостановленных частей — всё, что находится за пределами границ Suspense, — готова к потоковой передаче. Это подходящий момент, чтобы установить код состояния HTTP и заголовки ответа, а затем вызвать pipe(res) или начать чтение из ReadableStream.
Почему коды состояния необходимо устанавливать заранее
Коды состояния HTTP и заголовки необходимо отправить до начала передачи тела ответа. Поскольку потоковая передача начинается с onShellReady, вся логика обработки ошибок — установка состояния 500 или перенаправление — должна выполняться до начала передачи оболочки: после начала потоковой передачи код состояния уже нельзя изменить.
Обработка ошибок: onShellError
onShellError срабатывает, когда до готовности оболочки происходит критическая ошибка, например ошибка в корневом компоненте, находящемся за пределами любой границы Suspense. В этом случае оболочка не передаётся потоком, и следует ответить статической страницей ошибки или перенаправить пользователя на маршрут ошибки.
Обработка ошибок: onError
onError срабатывает для ошибок, которые можно обработать внутри границ Suspense. React всё ещё может передавать оставшуюся часть страницы; граница с ошибкой отображает резервный интерфейс ошибки. Используйте onError для ведения журнала: отправляйте сведения об ошибке на платформу наблюдаемости, не прерывая поток.
Прогрессивное улучшение и время ожидания
Если данные границы Suspense обрабатываются слишком долго, всё равно передайте оболочку в поток и позвольте границе гидратироваться на клиенте. Реализуйте тайм-аут: через 5 секунд вызовите abort() для потока, если граница ещё не разрешилась, и тогда клиент сам получит данные через useEffect.
Механика потоковой передачи в Cloudflare Workers
Среда выполнения Workers напрямую передаёт ReadableStream как тело ответа. Инфраструктура Cloudflare пересылает каждый фрагмент в браузер пользователя по мере того, как React его формирует, не буферизуя весь документ. Это означает, что первые байты HTML покидают пограничный узел в течение нескольких миллисекунд после получения запроса.
Прерывание: управление длинными потоками
renderToReadableStream возвращает функцию контроллера прерывания. Если запрос отменён (пользователь перешёл на другую страницу), вызов abort() останавливает дальнейшую отрисовку React и обработку данных. Это предотвращает напрасные вычисления для оставшихся без владельца запросов и ограничивает использование CPU рабочим процессом Worker.
Профиль сквозной задержки
При потоковой передаче с границы полная цепочка задержек выглядит так: 5 мс (от запроса до ближайшего пограничного узла) + 2 мс (холодный запуск Worker) + 8 мс (отрисовка оболочки) = 15 мс до получения первого байта. Браузер пользователя отрисовывает элемент LCP из оболочки, пока остальная часть страницы продолжает поступать в фоновом режиме.
Время вызова onShellReady
Когда именно во время потоковой передачи SSR вызывается обратный вызов onShellReady?
Итоги урока
Потоковая передача SSR с границы доставляет HTML фрагментами, улучшая FCP и LCP за счёт немедленной отправки оболочки. Границы Suspense разделяют дерево на независимые секции, которые можно передавать в потоке. onShellReady — это сигнал для начала передачи данных; коды состояния нужно задать до его вызова. onShellError обрабатывает критические сбои, onError — устранимые, а abort() предотвращает напрасную работу для отменённых запросов.
Часто задаваемые вопросы
Урок «Потоковая SSR с периферии» бесплатный?
Да — полный текст урока «Потоковая SSR с периферии» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Потоковая SSR с периферии»?
Передавайте HTML-вывод React через ReadableStream, чтобы браузер мог немедленно отобразить содержимое, важное для пользователя Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Потоковая SSR с периферии»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое периферийный рендеринг и почему он важен
- React на Cloudflare Workers с Hono
- Потоковая SSR с периферии
- Стратегии периферийного кэширования для приложений React