我已经阅读了文档,但我并没有真正理解React 16中hydrate()
和render()
之间的区别。
我知道hydrate()
用于组合SSR和客户端渲染。
有人可以解释什么是保湿,然后ReactDOM有什么区别?
来自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树的速度非常慢。
除了以上......
ReactDOM.hydrate()
与render()
相同,但它用于水合(附加事件侦听器)一个容器,其内容由ReactDOMServer呈现。 React将尝试将事件侦听器附加到现有标记。
使用ReactDOM.render()来水合服务器渲染的容器由于速度慢而被弃用,并且将在React 17中删除,因此请改用hydrate()
。
水合物基本上用于SSR(服务器端渲染)的情况。 SSR为您提供从服务器发送的骨架或HTML标记,这样第一次加载页面时它不是空白的,搜索引擎机器人可以为SEO编制索引(SSR的用例)。因此,hydrate将JS添加到您的页面或应用SSR的节点。这样您的页面就会响应用户执行的事件。
渲染用于在客户端浏览器Plus上渲染组件,如果您尝试使用渲染替换水合物,您将收到一个警告,即渲染已弃用,并且在SSR的情况下不能使用。它被移除,因为它与水合物相比较慢。
将功能放回已经在服务器端React中呈现的HTML的整个过程称为水合。
因此,对曾经呈现的HTML重新渲染的过程称为水合作用。
因此,如果我们试图通过调用ReactDOM.render()
来保湿我们的应用程序,它应该通过调用ReactDOM.hydrate()
完成。