惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
博客园_首页
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
博客园 - 司徒正美
有赞技术团队
有赞技术团队
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog

博客园 - 梦烬

收到一个网页链接,先看清再决定要不要打开:MeowToolkit 的链接提取 不改 iPhone 系统语言,也能单独切换扫描工具:MeowScanner 的中英界面入口 待办写下后还是会忘:妙啊清单把截止事项带进时间线 想养成习惯却总忘记开始:Steady 把它变成今天的一段计时 重要日期散在备忘录里:妙啊时刻把“还有多久”放回时间线 Uber 与 Anthropic 关于 AI Skills 的实践与洞察 Cursor公布的这张图,价值千金 我用AI做了第一个付费App,现已上架AppStore 我用AI做了第一个付费App,现已上架AppStore React SSR源码剖析 精通 React SSR 之 API 篇 SSR 与当年的 JSP、PHP 有什么区别? 2020 SSR落地开花的三大机遇 SSR 它到底香不香?细数 SSR 的利与弊 假如 Web 当初不支持动态化 如何提升前端基建的效能价值? 如何衡量前端基建的效能价值? 从面向对象角度看前端工程体系 「前端工程化」该怎么理解? 跨端方案的三大困境 React 17 要来了,非常特别的一版 low-code 与 20 年前的 Dreamweaver 有什么区别? 什么才是定制化IDE的核心价值? 移动端跨平台技术之下的变与不变
图解React SSR中的hydrate
梦烬 · 2020-12-01 · via 博客园 - 梦烬

当初在理解 React CSR 时做过一个比喻,把单向数据流比作瀑布模型

瀑布模型:由props(水管)和state(水源)把组件组织起来,组件间数据流向类似于瀑布。数据流向总是从祖先到子孙(从根到叶子),不会逆流

(摘自深入 React

单组件的微观视角下,我们把props理解为水管(数据通道),接收外部传递进来的数据(水),每一份state都是一处水源(想象泉眼冒水,即产生数据的地方),将这棵通过props管道连接而成的组件树立起来,就形成了自上而下的水流(瀑布):

想象上图整面瀑布墙上有无数的泉眼,state值顺着props管道流淌

从更宏大的视角来看,组件树就像是一系列竹管连接起来的水车,数据是水源(statepropscontext以及外部数据源),水自上而下地流经整个组件树到达叶子组件,渲染出漂亮的视图

先通过一张图来感受竹管输水:

再感受水源以及水车整体的运转:

左侧的小桶就是外部数据源,随时舀起一瓢灌到某个组件(竹管)中,让其内部的state(储水)发生变化,变化的水流经过整个子树到达叶子组件,渲染出变化后的视图,这就是交互操作导致数据变化时的组件更新过程

CSR 模式下,我们把水理解为数据,同样适用于 SSR,只是过程稍复杂些:

  1. 服务端渲染:在服务端注入数据,构建出组件树
  2. 序列化成 HTML:脱水成人干
  3. 客户端渲染:到达客户端后泡水,激活水流,变回活人

类比三体人的生存模式,乱纪元来临时先脱水成人干(SSR 中的服务端渲染部分),恒纪元到来后再泡水复活(SSR 中的客户端 hydrate 部分)

首先要有水可脱,所以先要拉取数据(水),在服务端完成组件首次渲染(mount)的过程:

也就是根据外部数据构建出初始组件树,过程中仅执行render及之前的几个生命周期,是为了尽可能缩短保命招数的前摇,尽快脱水

接着对组件树进行脱水,使其在恶劣的环境同样能够以一种更简单的形态“生存”下来,比如禁用了 JavaScript 的客户端环境

比组件树更简单的形态是 HTML 片段,脱去生命的水气(动态数据),成为风干标本一样的静态快照:

内存里的组件树被序列化成了静态的 HTML 片段,还能看出来人样(初始视图),不过已经无法与之交互了,但这种便携的形态尤其适合运输,能够通过网络传输到地球上的某个客户端

抵达客户端后,如果环境适宜(没有禁用 JavaScript),就立即开始“浸泡”(hydrate),组件随之复苏

客户端“浸泡”的过程实际上是重新创建了组件树,将新生的水(statepropscontext等)注入其中,并将鲜活的组件树塞进服务端渲染的干瘪躯壳里,使之复活

注水复活其实比三体人浸泡复苏更强大一些,能够修复肢体性的损伤(缺失的 HTML 结构会重新创建),但并不纠正口歪眼斜之类的小毛病(忽略属性多了少了、属性值对不上之类的问题,具体见React SSR 之原理篇

P.S.浸泡也需要一定时间,所以在 SSR 模式下,客户端有一段时间是无法正常交互的,注水完成之后才能彻底复活(单向数据流和交互行为都恢复正常)