TanStack 的数据模型不是“比 Next 自动”。它的优势恰好是没那么自动:loader、Query、HTTP cache、Cloudflare cache 各管各的。
| 层 | 适合放什么 | 不适合放什么 |
|---|---|---|
| TanStack Router loader cache | 路由进入前必须有的数据;按 path/search key 缓存 | 跨多个路由共享、复杂 mutation、乐观更新 |
| TanStack Query | 共享 server state、mutation、invalidate、分页、后台同步 | 纯路由守卫、简单一次性页面数据 |
| Cloudflare/HTTP cache | 公开、可按 Cache-Control 缓存的响应 | 用户私有数据、强一致写后读 |
Next 的缓存常与 fetch、RSC、route cache、router cache 绑在一起。TanStack 的建议更接近:缓存是数据层选择,不是框架替你盖章。
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => fetchPost(params.postId),
staleTime: 10_000,
gcTime: 5 * 60_000,
})如果数据可公开缓存,优先考虑标准 HTTP cache headers,让 Cloudflare 边缘缓存工作。用户私有数据则走 server functions + D1/KV/R2,并明确认证和缓存边界。
一个用户 dashboard 的多个 widget 共享同一份 account 数据,并会被 mutation 更新。优先用什么管理?
TanStack Query Overview 与 Router Data Loading。