Потоковая передача в React 18: как работает renderToPipeableStream
Разберитесь, как renderToPipeableStream поэтапно отправляет фрагменты HTML до завершения получения всех асинхронных данных
«Потоковая передача в React 18: как работает renderToPipeableStream» — бесплатный урок React Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
До React 18: синхронное узкое место
До React 18 серверная отрисовка использовала renderToString, работающий синхронно: React полностью преобразовывал дерево компонентов в строку до отправки любого HTML в браузер. Если какой-либо компонент загружал данные, серверу приходилось ждать все данные, прежде чем первый байт достигал пользователя.
React 18: renderToPipeableStream
В React 18 появился renderToPipeableStream, который преобразует дерево компонентов в поток фрагментов HTML. Вместо ожидания полной готовности React отправляет HTML по мере завершения каждой части дерева, позволяя браузеру немедленно начать отрисовку видимого содержимого.
Устройство: pipe и abort
renderToPipeableStream возвращает объект с двумя методами: pipe(writable) и abort(). Метод pipe принимает доступный для записи поток Node.js Writable, обычно HTTP-ответ, и начинает передавать в него HTML. abort() отменяет поток, когда запрос отменён или превышено время ожидания.
Что поступает в поток первым: оболочка
Поток начинается с оболочки HTML — всего содержимого, не заблокированного ожидающей границей Suspense. Сюда входят заголовок документа, навигация, нижний колонтитул, элементы макета и любой контент, доступный синхронно. Оболочка передаётся немедленно, ещё до разрешения компонентов, зависящих от данных.
Резервные варианты Suspense в потоке
Компоненты внутри границ Suspense, ожидающие данных, сначала поступают в поток в виде резервного интерфейса, например индикатора загрузки. Позже React отправляет тег script, который заменяет резервный вариант готовым содержимым, — и всё это без повторной отрисовки оболочки на стороне клиента.
bootstrapScripts для гидратации клиента
Передайте bootstrapScripts: ['/static/js/client.js'] в renderToPipeableStream, чтобы указать React вставить тег script в конец потока. Браузер загружает этот пакет и вызывает hydrateRoot, подключая обработчики событий React к отрисованному сервером DOM.
onShellReady: подходящий момент для передачи потока
onShellReady срабатывает, когда оболочка HTML, то есть всё за пределами ожидающих границ Suspense, готова к отправке. Это правильный момент для вызова pipe(res), но важно установить код состояния HTTP и заголовки ответа до вызова pipe, поскольку поток фиксирует статус HTTP.
Настройка заголовков перед началом потоковой передачи
Поскольку потоковая передача начинается сразу после вызова pipe(), все присваивания res.setHeader или res.statusCode должны выполняться до вызова pipe(). Распространённый шаблон — установить статус 200 и Content-Type: text/html в обратном вызове onShellReady, а сразу после этого вызвать pipe(res).
onShellError: Критические ошибки до завершения оболочки
onShellError срабатывает, когда до завершения рендеринга оболочки происходит неустранимая ошибка — например, компонент верхнего уровня выбрасывает исключение вне какой-либо границы Suspense. В этом случае нельзя передавать частичный ответ; вместо этого следует перенаправить пользователя на страницу ошибки или отправить статический HTML-документ с ошибкой.
onAllReady: Для ботов и поисковых роботов
onAllReady срабатывает, когда всё дерево React полностью разрешено, включая все границы Suspense. Для поисковых роботов и средств предварительного просмотра ссылок в социальных сетях необходимо отправлять полный HTML без потоковой передачи. Проверьте, что запрос поступил от бота, и вызовите pipe(res) в onAllReady вместо onShellReady.
Восстановление после ошибок во время потоковой передачи
onError срабатывает при ошибках в границах Suspense — React по-прежнему может передавать остальную часть страницы, пока эта граница переходит к своему интерфейсу ошибки. Используйте onError, чтобы записать ошибку в журнал вашего конвейера наблюдаемости, не прерывая поток для пользователя.
onAllReady и onShellReady
Когда следует использовать onAllReady вместо onShellReady для начала передачи?
Итоги урока
renderToPipeableStream — это примитив потоковой SSR в React 18 для серверов Node.js. Он немедленно передаёт HTML-оболочку через onShellReady, заполняет границы Suspense по мере разрешения данных и гидратирует клиент с помощью bootstrapScripts. Используйте onAllReady для ботов и поисковых роботов, onShellError — для критических сбоев и всегда устанавливайте HTTP-заголовки до вызова pipe().
Часто задаваемые вопросы
Урок «Потоковая передача в React 18: как работает renderToPipeableStream» бесплатный?
Да — полный текст урока «Потоковая передача в React 18: как работает renderToPipeableStream» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Потоковая передача в React 18: как работает renderToPipeableStream»?
Разберитесь, как renderToPipeableStream поэтапно отправляет фрагменты HTML до завершения получения всех асинхронных данных Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Потоковая передача в React 18: как работает renderToPipeableStream»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Потоковая передача в React 18: как работает renderToPipeableStream
- Границы Suspense и приоритет потоковой передачи
- Прогрессивная гидратация с выборочной гидратацией
- Измерение влияния потоковой передачи: FCP, TTI и LCP