SSR 中如何把服务端数据「注水」到客户端,避免重复请求?
服务端取到的数据要序列化进 HTML,客户端注水时直接复用,避免再请求一次(防瀑布流/闪烁)。
// 服务端:把数据挂到 window 上
const data = await fetchData()
const html = `<div id="root">${renderToString(<App data={data}/>)}</div>
<script>window.__INITIAL_STATE__ = ${JSON.stringify(safeData)}</script>`
// 客户端:直接读,不再请求
const data = window.__INITIAL_STATE__
hydrateRoot(document.getElementById('root'), <App data={data}/>)注意安全:
- 用
JSON.stringify后要做 XSS 转义(<等),防<script>注入 - 不要注入敏感信息(token、密码)
- React 18 的 Server Component / Next
useFetch已自动处理注水