SSR 与 RSC
服务端可以先输出有用的界面,却不知道访客的窗口大小、剪贴板、网络或存储状态。Better Hooks 会把这段未知保留下来,而不是猜一个像真的答案。
把边界放在 Hook 旁边
Better Hook 必须在 Client Component 中运行。请把 'use client' 放在实际调用它的最小组件里。Server Component 可以渲染这个子组件并传递可序列化 props,但不能直接调用 Hook。
导入没问题,调用属于客户端
导入包时不会注册监听器、启动定时器、读取存储或访问 DOM,因此模块可以安全进入服务端构建。真正调用 Hook 的位置仍然要在客户端组件树中。
从稳定的回退值开始
面向浏览器的 Hook 都有明确的服务端结果:
| Hook | 服务端结果 |
|---|---|
useMediaQuery | defaultMatches,未提供时为 false |
useWindowSize | { width: 0, height: 0 } |
useOnline | true |
| 存储 Hooks | 由调用方传入的初始值 |
| 监听与定时 Hooks | 服务端渲染期间不创建订阅或定时器 |
中性默认值不适合当前界面时,请显式传入初始值。
让 Hydration 接上真实值
先渲染一个可用的首屏,再让 React 在 Hydration 后同步浏览器快照。不要只因为服务端不知道某个测量值,就替换页面中的大块内容。
把浏览器能力缺失当作正常情况
浏览器 API 可能不存在,也可能拒绝访问。Hook 会返回约定的回退值,或把错误交给调用方。界面应保留一个可用的中性状态,而不是假定能力永远存在。