Рендеринг на стороне сервера с ReactDOM.hydrate

hydrate перешел на React 16, но его использование еще не задокументировано.

В этой статье предполагается, что он должен использоваться с renderToNodeStream, но не содержит подробностей.

Каково ожидаемое использование hydrate?

renderToString синхронно. Он также не может обрабатывать повторно отрисованные компоненты, то есть когда синхронные (т. Е. Одинаковые тики) изменения состояния компонента происходят во время первоначального отрисовки и должны запускать дополнительные render вызовы. Примером является Helmet, которому требуется обходной путь для распространения изменений из вложенных Helmet вернуться к компоненту верхнего уровня на стороне сервера.

Могут ли hydrate и renderToNodeStream помочь избежать renderToString ограничений и отображать асинхронные и / или повторно отображаемые компоненты на стороне сервера?


person Estus Flask    schedule 25.09.2017    source источник


Ответы (1)


Использование 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