CSR React应用的执行成本与等价SSR应用的水合成本是否相同?
你这个观察真的精准戳中了SSR的核心权衡点!作为常年在CSR和SSR之间横跳的开发者,我来给你唠唠明白~
首先得给你划个重点:SSR确实逃不掉JS执行的成本,但它和CSR的成本不是一回事,而且最关键的是成本发生的时机和用户感知完全不同。
先说说纯CSR的情况:用户打开页面后,先下载你的React bundle,然后浏览器从零开始执行所有JS——创建VDOM、渲染真实DOM、绑定事件 handlers,整个过程用户盯着的就是空白屏,必须等所有这些步骤全做完,才能看到内容+用交互。所有成本都堆在用户端的「首屏等待阶段」,体验拉胯是真的。
再看SSR的流程:服务器先帮你执行React代码,把组件转成完整的HTML字符串发给浏览器。这时候用户立刻就能看到完整的静态页面内容,不用等JS加载执行!这才是SSR首屏快的核心——用户感知到「内容加载完成」的时间被大大提前了,哪怕这时候页面还不能交互,至少有东西看,不会觉得“网站卡爆了”。
接下来就是你关心的水合成本:等浏览器下载完React bundle之后,确实要做水合操作——把服务器已经生成的DOM和客户端的VDOM做对齐,绑定事件、激活组件的交互能力。这一步的JS执行成本,和CSR里「创建VDOM+渲染DOM+绑事件」的成本大体相当,但有细微差别:比如SSR水合不需要重新生成DOM节点(服务器已经发了现成的HTML),只是做“激活”,所以理论上比纯CSR的初始渲染成本略低一丢丢,但这个差异在大多数业务场景下感知不明显。
所以回到你的问题:SSR并没有减少总JS执行成本(首屏相关的部分),但它把「内容可见」和「交互可用」这两个阶段拆开了——用户先看到内容(解决了首屏空白的焦虑),再慢慢等交互激活,而不是像CSR那样必须等所有JS执行完才能看到任何东西。这才是SSR最核心的价值,而不是“省JS”。
另外补充个进阶点:React 18之后还支持选择性水合,你可以让首屏不需要的组件晚一点水合,进一步优化客户端的加载体验,但这属于锦上添花的操作了。
备注:内容来源于stack exchange,提问作者Gambit2007

