跳转到页面内容
圆点软件.YUANDIAN SOFTWARE

YUANDIAN / INSIGHTS & IDEAS

Nuxt 3 服务端取数与客户端水合的配合方式

服务端取数和客户端水合配合不好,页面就会先空后跳。理清数据在哪一端执行、依赖怎么声明、状态如何对齐,首屏才稳定。

专注软件开发 · 连接业务与可能技术分享
Nuxt 3 服务端取数与客户端水合的配合方式

明确数据发生在哪一端

框架提供的取数组合式函数默认在服务端执行一次,结果序列化后随 HTML 一起下发,客户端水合时直接复用,不再重复请求。这是它相比手写请求的核心差别。

如果组件没有用这两个取数函数,而是在挂载后请求,那首屏必然先渲染空状态再补数据,用户会看到明显跳动,列表页尤其明显。

判断标准很简单:打开页面查看网络面板,如果首屏内容已经在 HTML 里,说明服务端取数生效;如果内容全靠后续异步请求补齐,就该改。

正确使用缓存键与依赖

同一页面里多个组件调用同名接口时,要显式传缓存键区分,否则缓存会互相覆盖,出现甲组件显示乙组件数据的情况。

依赖其他异步结果的请求要写进监听配置,让框架知道何时重新执行,而不是自己在初始化阶段等待后再手动赋值。

服务端与客户端的请求参数必须一致。用了浏览器全局对象或本地存储里的值做参数,服务端拿不到就会渲染出与客户端不同的内容,直接导致水合告警。

处理只属于浏览器的逻辑

访问浏览器全局对象的代码放在挂载钩子里,或者用仅客户端渲染的组件包起来。用环境判断虽然也能绕过报错,但会让两端渲染结果不一致。

第三方脚本、地图、富文本编辑器这类强依赖文档对象的组件,保持客户端渲染并用占位骨架撑好高度,避免加载完成后的布局跳动。

本地存储的登录态要在客户端确认后再决定是否请求用户信息,服务端阶段先渲染通用状态,两边结构一致就不会报水合不匹配。

缓存与性能取舍

服务端取数会把耗时记进首屏响应时间,接口慢会直接拖慢首字节时间。对实时性要求不高的数据,在服务端加一层短期缓存,命中时响应能明显加快。

取数函数的缓存读取回调可以控制客户端导航时是否复用已有数据,列表页进详情再返回时,复用能避免重复请求和闪烁。

静态内容可以在构建期生成,把接口调用从运行时前移。数据更新频率低、页面数量可控的站点,预渲染的收益最为直接。

错误处理与水合调试

服务端请求失败时,默认会让整个页面进入错误状态。对非关键模块可以捕获错误后渲染降级内容,不要因为一个次要接口挂掉整页。

加载态在服务端渲染时不会被看到,但客户端导航时会。用等待状态控制骨架屏,注意服务端和客户端初始结构要一致。区分参数错误与服务异常的处理方式,参数错误渲染明确提示,服务异常则重试或降级。

控制台出现水合不匹配时,先定位是哪个节点文本不一致。常见原因是时间格式化、随机数、语言环境差异。日期处理在两端使用同一时区和同一函数,随机标识改用框架提供的标识或在挂载后生成。

排查阶段可以临时把可疑组件改成只客户端渲染,确认问题消失后再逐步收回服务端渲染,找到确切的那一处。

NuxtSSR前端

LET’S BUILD TOGETHER

让思考,成为下一步行动。

把业务场景与初步想法告诉我们,一起找到合适的实现方式。