前端数据请求与缓存管理: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` 与窗口焦点刷新使用乐观更新提升交互,确保回滚与失效策略引入持久化与版本校验,保障一致性与可靠性

发表评论 取消回复