Использование hydrate
не ограничивается renderToNodeStream
- вы можете (на самом деле, должны) также использовать его с классическим renderToString
. renderToNodeStream
по сути то же самое, что renderToString
, за исключением того, что он создает поток http вместо строки. Это означает, что вы можете отправить визуализированный HTML-код клиенту байт за байтом во время рендеринга, в отличие от стандартного renderToString
, когда вам нужно дождаться, пока вся HTML-строка будет отображена первой, и только после этого можно вы отправляете его клиенту.
ReactDOM.hydrate
является заменой стандартного ReactDOM.render
. Основное (и единственное?) Отличие состоит в том, что, в отличие от ReactDOM.render
, он не отбрасывает всю DOM, если контрольная сумма React на клиенте не совпадает с той, которая рассчитана на сервере. Он пытается прикрепить клиентское приложение React к DOM, отрисованному на сервере, даже если есть некоторые тонкие различия, путем исправления только различных частей.
Из-за потокового характера renderToNodeStream
использование Helmet на стороне сервера практически невозможно в текущем состоянии библиотеки - head
часть DOM отправляется на сервер к тому времени, когда React получает для вычисления DOM, включая компоненты Helmet. Поток не может просто вернуться и добавить изменения Helmet в head
.
Итак, отвечая на ваш вопрос, renderToNodeStream
решает проблему синхронного рендеринга в строку, отправляя поток, но при этом возникает новая проблема, заключающаяся в невозможности исправлять отправляемый контент, если этого требует какая-то дальнейшая часть приложения React. Он ничего не добавляет в плане изменения состояния и повторного рендеринга на стороне сервера. С другой стороны, hydrate
не представляет ничего нового в этой теме - это просто доработанная, более щадящая версия старого render
.
Официальные документы многое объясняют! https://reactjs.org/docs/react-dom.html
person
jalooc
schedule
09.11.2017