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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部