跳到正文
本页内容

SSR 与 RSC

服务端可以先输出有用的界面,却不知道访客的窗口大小、剪贴板、网络或存储状态。Better Hooks 会把这段未知保留下来,而不是猜一个像真的答案。

把边界放在 Hook 旁边

Better Hook 必须在 Client Component 中运行。请把 'use client' 放在实际调用它的最小组件里。Server Component 可以渲染这个子组件并传递可序列化 props,但不能直接调用 Hook。

导入没问题,调用属于客户端

导入包时不会注册监听器、启动定时器、读取存储或访问 DOM,因此模块可以安全进入服务端构建。真正调用 Hook 的位置仍然要在客户端组件树中。

从稳定的回退值开始

面向浏览器的 Hook 都有明确的服务端结果:

Hook服务端结果
useMediaQuerydefaultMatches,未提供时为 false
useWindowSize{ width: 0, height: 0 }
useOnlinetrue
存储 Hooks由调用方传入的初始值
监听与定时 Hooks服务端渲染期间不创建订阅或定时器

中性默认值不适合当前界面时,请显式传入初始值。

让 Hydration 接上真实值

先渲染一个可用的首屏,再让 React 在 Hydration 后同步浏览器快照。不要只因为服务端不知道某个测量值,就替换页面中的大块内容。

把浏览器能力缺失当作正常情况

浏览器 API 可能不存在,也可能拒绝访问。Hook 会返回约定的回退值,或把错误交给调用方。界面应保留一个可用的中性状态,而不是假定能力永远存在。