В основе механизма кэширования RTK Query лежит нормализованное
хранение результатов запросов внутри Redux store. Каждый endpoint
формирует ключи кэша на базе аргументов запроса, а состояние хранится в
виде дерева с разделением на queries,
mutations и служебные метаданные.
Основной фрагмент состояния:
state.api.queries — кэш успешных запросовstate.api.mutations — состояние мутацийstate.api.provided — связи тегов и сущностей
(используется для инвалидации)Каждый элемент в queries содержит не только данные
ответа, но и метаинформацию:
pending, fulfilled,
rejected)data)error)Инспектирование этого слоя позволяет точно понимать поведение кэша, причины повторных запросов и моменты рефетча.
RTK Query полностью интегрирован в Redux, поэтому состояние кэша
доступно через store.getState().
const state = store.getState();
const apiState = state.api;
Далее интерес представляет структура queries:
const queries = state.api.queries;
Каждый ключ в queries — это сериализованный аргумент
запроса.
Пример:
{
"getUser({id:1})": {
status: "fulfilled",
endpointName: "getUser",
originalArgs: { id: 1 },
data: { id: 1, name: "Alex" },
fulfilledTimeStamp: 1710000000000
}
}
RTK Query предоставляет встроенные селекторы, которые предпочтительнее прямого доступа к state, так как учитывают мемоизацию и внутренние оптимизации.
const selectUser = api.endpoints.getUser.select({ id: 1 });
const result = selectUser(store.getState());
Возвращаемая структура:
{
data,
status,
isLoading,
isFetching,
isSuccess,
isError,
error,
requestId,
endpointName,
originalArgs
}
Инспекция через селекторы позволяет отслеживать состояние конкретного
кэша без ручного разбора state.api.queries.
В React-интеграции RTK Query можно напрямую наблюдать состояние кэша
через useSelector:
const userQueryState = useSelector(
api.endpoints.getUser.select({ id: 1 })
);
Каждое изменение кэша вызывает перерендер компонента, если изменяется выбранный фрагмент состояния.
Важно, что RTK Query минимизирует лишние обновления за счёт:
Каждый cache entry содержит служебные поля, которые позволяют анализировать поведение запроса.
pending — запрос выполняетсяfulfilled — данные успешно полученыrejected — ошибка выполненияisFetching — активный сетевой запросisLoading — первый запрос без кэшаisSuccess — успешное завершениеisError — ошибкаfulfilledTimeStamp используется для:
RTK Query сериализует аргументы запроса для формирования ключа. Это означает, что инспектирование кэша требует понимания того, как именно формируется строка ключа.
Пример:
getUser({ id: 1 })
getUser({ id: 2 })
Будут два независимых ключа.
Однако:
getUser(1)
getUser({ id: 1 })
Могут привести к разным кэш-ячейкам, если сериализация отличается.
Поэтому при инспектировании важно анализировать:
originalArgsendpointNameRedux DevTools предоставляет полную картину RTK Query store.
В состоянии можно наблюдать:
queriesОсобенно полезны следующие сценарии:
RTK Query middleware генерирует lifecycle actions:
api/executeQuery/pendingapi/executeQuery/fulfilledapi/executeQuery/rejectedКаждое действие содержит:
meta.requestIdmeta.argpayload (для fulfilled)error (для rejected)Пример анализа:
store.subscribe(() => {
const actions = actionLog.getLast();
console.log(actions);
});
Это позволяет отслеживать, как именно изменяется кэш в реальном времени.
Для глубокого анализа часто требуется сравнение snapshot-ов состояния.
Пример подхода:
const prev = previousState.api.queries;
const next = currentState.api.queries;
const diff = Object.keys(next).filter(
key => prev[key] !== next[key]
);
Это позволяет выявить:
Система тегов напрямую влияет на структуру кэша.
Когда выполняется:
invalidatesTags: ["User"]
RTK Query:
provided картуИнспекция:
state.api.provided
показывает соответствие:
Это ключевой инструмент анализа причин автоматических обновлений данных.
Повторные запросы часто связаны не с ошибками API, а с политиками кэширования:
refetchOnMountOrArgChangerefetchOnFocusrefetchOnReconnectkeepUnusedDataForИнспектирование включает проверку:
Пример анализа подписчиков:
state.api.queries[key].subscriptions
Если subscriptions пустой, запись становится кандидатом
на удаление.
Полный цикл cache entry:
pendingfulfilled или rejectedКаждый шаг отражается в состоянии store и может быть отследен через middleware или DevTools.
При комплексной диагностике обычно анализируются одновременно:
state.api.queries — текущие данныеstate.api.mutations — активные операции записиstate.api.provided — связи теговСовокупность этих источников позволяет восстановить полную картину поведения RTK Query без внешних инструментов.