Переход с TanStack Query v4 на v5 затрагивает не только набор API, но и внутренние соглашения библиотеки о том, как должны строиться запросы, мутации и управление кешем. Версия 5 продолжает развитие идеи строгой предсказуемости состояния и уменьшения скрытого поведения.
Ключевое направление изменений — устранение неявных побочных эффектов, унификация сигнатур и более жесткое разделение ответственности между слоями: запросы, кеш, побочные эффекты и синхронизация.
В версии 5 пакет переименован в соответствии с экосистемой TanStack:
npm install @tanstack/react-query
Для React-проекта также используется:
npm install @tanstack/react-query-devtools
Удаляются старые зависимости:
npm uninstall react-query
Важно учитывать, что пакет react-query больше не
используется вообще, даже как alias.
В v5 усилилась типизация и строгость конфигурации
QueryClient.
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
},
},
});
Поведение по умолчанию стало более предсказуемым, и часть опций была переосмыслена. Теперь важно явно указывать стратегию кеширования.
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60,
gcTime: 1000 * 60 * 5,
},
},
});
cacheTime переименован в gcTimeЭто одно из самых критичных изменений миграции.
В v4 использовался термин cacheTime, который описывал
время жизни неиспользуемого кеша.
В v5 термин изменён на gcTime (garbage collection time),
чтобы точнее отражать поведение.
// v4
cacheTime: 1000 * 60 * 5
// v5
gcTime: 1000 * 60 * 5
staleTime остался без измененийВ v5 усилилась унификация объекта параметров.
useQuery(['todos'], fetchTodos, {
enabled: true,
});
useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
enabled: true,
});
В v5 усилилась строгость:
queryKey обязателенconst mutation = useMutation({
mutationFn: createTodo,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
},
});
useMutation(createTodo, {
onSuccess: () => {},
});
mutationFn обязателенВ v5 изменился способ вызова invalidate:
queryClient.invalidateQueries(['todos']);
queryClient.invalidateQueries({
queryKey: ['todos'],
});
Теперь можно явно управлять поведением:
queryClient.invalidateQueries({
queryKey: ['todos'],
exact: true,
});
Удаление запросов также стало более явным:
queryClient.removeQueries({
queryKey: ['todos'],
});
Поведение стало более предсказуемым: библиотека не пытается угадать намерение разработчика.
Хотя JavaScript остаётся поддерживаемым, v5 ориентирован на строгую типизацию.
Основные изменения:
queryFninfer типамиПример:
useQuery({
queryKey: ['user', userId],
queryFn: async () => {
const res = await fetch(`/api/user/${userId}`);
return res.json();
},
});
Тип результата теперь выводится точнее без дополнительных аннотаций.
В v5 были удалены или переработаны следующие возможности:
Любые формы:
useQuery(key, fn, options);
useMutation(fn, options);
больше не поддерживаются.
Поведение refetch стало более управляемым через explicit options:
Теперь рекомендуется явно задавать поведение:
useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
refetchOnWindowFocus: false,
});
В v5 кеш стал более явной сущностью.
gcTime управляет удалением неиспользуемых данныхstaleTime управляет устареваниемРанее часто путали cacheTime и staleTime. Теперь:
Поведение invalidation стало более детерминированным.
invalidateQueries мог:
Devtools обновлены под новый API:
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
Особенности:
Синтаксис остался прежним, но ожидает v5 клиент:
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<AppContent />
</QueryClientProvider>
);
}
При переходе на v5 изменения целесообразно выполнять по этапам:
react-query →
@tanstack/react-querycacheTime → gcTimeuseQuery(['key'], fn);
Ошибка: не поддерживается.
cacheTime: 1000 * 60
Ошибка: свойство игнорируется.
queryClient.invalidateQueries('todos');
Ошибка: требуется объект.
v5 делает акцент на следующих принципах:
Эта версия уменьшает количество “скрытого поведения”, которое в v4 часто приводило к неоднозначным эффектам при сложных сценариях кеширования и синхронизации данных.