前端数据请求与缓存管理:SWR/TanStack Query 策略与一致性技术背景在现代前端应用中,数据请求与缓存管理直接影响性能与一致性。SWR(stale‑while‑revalidate)思想与 TanStack Query(React Query)提供了标准化的缓存、失效、并发去重与乐观更新能力,显著降低自研成本并提升可靠性。核心内容TanStack Query 基础配置与全局策略import { QueryClient, QueryClientProvider, useQuery, useMutation } from '@tanstack/react-query'; const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 60_000, // 1分钟内视为新鲜 cacheTime: 10 * 60_000, // 10分钟未使用后回收 refetchOnWindowFocus: true, retry: 2 } } }); function App() { return ( <QueryClientProvider client={queryClient}> <Users /> </QueryClientProvider> ); } function Users() { const { data, isLoading, isFetching } = useQuery({ queryKey: ['users'], queryFn: () => fetch('/api/users').then(r => r.json()) }); if (isLoading) return <div>Loading...</div>; return <div>{isFetching ? 'Refreshing...' : null}{JSON.stringify(data)}</div>; } 乐观更新与回滚function useCreateUser() { return useMutation({ mutationFn: (payload: any) => fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).then(r => r.json()), onMutate: async (newUser) => { await queryClient.cancelQueries({ queryKey: ['users'] }); const prev = queryClient.getQueryData(['users']) as any[] | undefined; queryClient.setQueryData(['users'], (old: any[] = []) => [{ ...newUser, id: 'temp' }, ...old]); return { prev }; }, onError: (_err, _newUser, ctx) => { if (ctx?.prev) queryClient.setQueryData(['users'], ctx.prev); }, onSettled: () => { queryClient.invalidateQueries({ queryKey: ['users'] }); } }); } 失效与并发去重// 列表与详情联动失效 function invalidateUser(id: string) { queryClient.invalidateQueries({ queryKey: ['users'] }); queryClient.invalidateQueries({ queryKey: ['user', id] }); } // 并发去重:相同 queryKey 的并发请求自动共享结果 离线持久化(IndexedDB)import { persistQueryClient } from '@tanstack/query-persist-client-core'; import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister'; const persister = createSyncStoragePersister({ storage: window.localStorage }); persistQueryClient({ queryClient, persister, maxAge: 24 * 60 * 60 * 1000 }); 一致性校验与版本检测async function ensureVersionConsistency() { const res = await fetch('/version.json', { cache: 'no-cache' }); const { version } = await res.json(); const local = sessionStorage.getItem('data-version'); if (local && local !== version) { queryClient.clear(); } sessionStorage.setItem('data-version', version); } 技术验证参数在企业与电商应用(Chrome 128/Edge 130)真实流量:缓存命中率:≥ 75%并发去重成功率:≥ 90%乐观更新回滚成功率:≥ 98%离线持久化命中:≥ 85%应用场景读多写少的数据展示与交互移动端弱网与离线场景列表/详情联动与实时刷新需求最佳实践合理设置 `staleTime/cacheTime` 与窗口焦点刷新使用乐观更新提升交互,确保回滚与失效策略引入持久化与版本校验,保障一致性与可靠性

发表评论 取消回复