跳转到内容

SSR 缓存注入策略

SSR Query 的核心是“每请求独立 client + 首屏缓存注入 + 客户端继续可拉取”。

  • 你要提升首屏可用时间。
  • 你要避免 hydration 后重复首请求。
  • 你要统一 SSR 与 CSR 的 key 策略。
// server
const client = createQueryClient({ defaultStaleTime: 10_000 });
await client
.query({
key: ['user', id],
queryFn: ({ signal }) => fetch(`https://example.com/api/users/${id}`, { signal }).then((r) => r.json()),
})
.prefetch();
const initialUser = client.getQueryData(['user', id]);
// client
if (initialUser) {
client.setQueryData(['user', id], initialUser);
}
  • server 复用全局 client,导致请求间串数据。
  • server/client key 不一致,注入不命中。
  • 只注入数据不注册查询,失效后无法自动拉取。
  • 明确“谁负责创建 client、谁负责注入”。
  • 把 key 定义抽到共享模块,减少偏差。
  • SSR 命中后仍保留失效刷新路径。

Infinite Query 同样支持脱水/注水。服务端可以使用 prefetchInfiniteQuery(definition, pages) 预取多页,再通过 dehydrate() 输出 infiniteQueries 字段。