React 16中的hydrate()和render()有什么区别?

问题描述 投票:39回答:4

我已经阅读了文档,但我并没有真正理解React 16中hydrate()render()之间的区别。

我知道hydrate()用于组合SSR和客户端渲染。

有人可以解释什么是保湿,然后ReactDOM有什么区别?

javascript reactjs react-dom react-fiber
4个回答
53
投票

来自ReactDOMServer文档(强调我的):

如果在已经具有此服务器呈现标记的节点上调用ReactDOM.hydrate(),React将保留它并仅附加事件处理程序,从而使您具有非常高性能的首次加载体验。

粗体文字是主要区别。如果初始DOM和当前DOM之间存在差异,render可能会更改您的节点。 hydrate只会附加事件处理程序。

来自Github issue that introduced hydrate as a separate API

如果这是你的初始DOM <div id="container"><div class="spinner">Loading...</div></div>然后调用ReactDOM.render(<div class="myapp"><span>App</span></div>, document.getElementById('container'))打算只做客户端渲染(不是水合)。然后你以<div id="container"><div class="spinner"><span>App</span></div></div>结束。因为我们没有修补属性。

仅供参考,他们没有修补属性的原因是

......在正常的水合模式下水合这个并且将初始渲染减慢到非SSR树的速度非常慢。


11
投票

除了以上......

ReactDOM.hydrate()render()相同,但它用于水合(附加事件侦听器)一个容器,其内容由ReactDOMServer呈现。 React将尝试将事件侦听器附加到现有标记。

使用ReactDOM.render()来水合服务器渲染的容器由于速度慢而被弃用,并且将在React 17中删除,因此请改用hydrate()


6
投票

水合物基本上用于SSR(服务器端渲染)的情况。 SSR为您提供从服务器发送的骨架或HTML标记,这样第一次加载页面时它不是空白的,搜索引擎机器人可以为SEO编制索引(SSR的用例)。因此,hydrate将JS添加到您的页面或应用SSR的节点。这样您的页面就会响应用户执行的事件。

渲染用于在客户端浏览器Plus上渲染组件,如果您尝试使用渲染替换水合物,您将收到一个警告,即渲染已弃用,并且在SSR的情况下不能使用。它被移除,因为它与水合物相比较慢。


4
投票

将功能放回已经在服务器端React中呈现的HTML的整个过程称为水合。

因此,对曾经呈现的HTML重新渲染的过程称为水合作用。

因此,如果我们试图通过调用ReactDOM.render()来保湿我们的应用程序,它应该通过调用ReactDOM.hydrate()完成。

© www.soinside.com 2019 - 2024. All rights reserved.