ReactDOM renderToString & renderToPipeableStream, как React обробатывает lazy + Suspense на клиенте?

ReactDOM.renderToString и ReactDOM.renderToPipeableStream — это методы, которые позволяют рендерить приложение на стороне сервера с использованием React. ReactDOM.renderToString возвращает строку, содержащую HTML-разметку с отрендеренным компонентом, а ReactDOM.renderToPipeableStream возвращает поток, который можно передавать по сети, и этот поток будет заполняться HTML-разметкой постепенно по мере готовности.

Lazy загрузка и Suspense — это функциональности React, которые позволяют эффективно управлять загрузкой компонентов на клиентской стороне. С помощью ленивой загрузки мы можем отложить загрузку компонента до тех пор, пока он действительно не понадобится. Suspense позволяет показывать заглушки (например, индикаторы загрузки) во время ожидания загрузки ленивого компонента. Как только компонент загружен, Suspense автоматически обновит интерфейс, заменяя заглушку на отрендеренный компонент.

На стороне сервера с использованием ReactDOM.renderToString и ReactDOM.renderToPipeableStream нет возможности использовать ленивую загрузку и Suspense напрямую, поскольку они требуют асинхронной загрузки компонентов, которая недоступна на сервере. Однако React предоставляет механизм, который называется "временная заглушка на сервере" (Server-side Rendering Placeholder, SSR Placeholder), который позволяет качественно решить эту проблему.

Механизм SSR Placeholder работает следующим образом: при рендеринге на сервере, вместо ленивого компонента будет отображаться SSR Placeholder — это обычный заглушка, которая может быть представлена в виде любого React компонента. Когда основная HTML-разметка (которую генерирует ReactDOM.renderToString или ReactDOM.renderToPipeableStream) будет отображена на клиенте, React заменит все SSR Placeholder'ы на отдельные теги, содержащие информацию о том, как и где загрузить ленивый компонент. А затем React асинхронно загрузит нужный компонент и заменит Placeholder на отрендеренный компонент, используя функциональность Suspense.

Таким образом, на клиенте React по-прежнему умеет обрабатывать и использовать ленивую загрузку и Suspense, если при рендеринге на сервере был правильно настроен и использован механизм SSR Placeholder. Это позволяет эффективно управлять загрузкой и отрисовкой компонентов на клиентской стороне, повышая производительность и улучшая пользовательский опыт.