
明确数据发生在哪一端
框架提供的取数组合式函数默认在服务端执行一次,结果序列化后随 HTML 一起下发,客户端水合时直接复用,不再重复请求。这是它相比手写请求的核心差别。
如果组件没有用这两个取数函数,而是在挂载后请求,那首屏必然先渲染空状态再补数据,用户会看到明显跳动,列表页尤其明显。
判断标准很简单:打开页面查看网络面板,如果首屏内容已经在 HTML 里,说明服务端取数生效;如果内容全靠后续异步请求补齐,就该改。
正确使用缓存键与依赖
同一页面里多个组件调用同名接口时,要显式传缓存键区分,否则缓存会互相覆盖,出现甲组件显示乙组件数据的情况。
依赖其他异步结果的请求要写进监听配置,让框架知道何时重新执行,而不是自己在初始化阶段等待后再手动赋值。
服务端与客户端的请求参数必须一致。用了浏览器全局对象或本地存储里的值做参数,服务端拿不到就会渲染出与客户端不同的内容,直接导致水合告警。
处理只属于浏览器的逻辑
访问浏览器全局对象的代码放在挂载钩子里,或者用仅客户端渲染的组件包起来。用环境判断虽然也能绕过报错,但会让两端渲染结果不一致。
第三方脚本、地图、富文本编辑器这类强依赖文档对象的组件,保持客户端渲染并用占位骨架撑好高度,避免加载完成后的布局跳动。
本地存储的登录态要在客户端确认后再决定是否请求用户信息,服务端阶段先渲染通用状态,两边结构一致就不会报水合不匹配。
缓存与性能取舍
服务端取数会把耗时记进首屏响应时间,接口慢会直接拖慢首字节时间。对实时性要求不高的数据,在服务端加一层短期缓存,命中时响应能明显加快。
取数函数的缓存读取回调可以控制客户端导航时是否复用已有数据,列表页进详情再返回时,复用能避免重复请求和闪烁。
静态内容可以在构建期生成,把接口调用从运行时前移。数据更新频率低、页面数量可控的站点,预渲染的收益最为直接。
错误处理与水合调试
服务端请求失败时,默认会让整个页面进入错误状态。对非关键模块可以捕获错误后渲染降级内容,不要因为一个次要接口挂掉整页。
加载态在服务端渲染时不会被看到,但客户端导航时会。用等待状态控制骨架屏,注意服务端和客户端初始结构要一致。区分参数错误与服务异常的处理方式,参数错误渲染明确提示,服务异常则重试或降级。
控制台出现水合不匹配时,先定位是哪个节点文本不一致。常见原因是时间格式化、随机数、语言环境差异。日期处理在两端使用同一时区和同一函数,随机标识改用框架提供的标识或在挂载后生成。
排查阶段可以临时把可疑组件改成只客户端渲染,确认问题消失后再逐步收回服务端渲染,找到确切的那一处。


