RTK Query тесно интегрирован с экосистемой Redux Toolkit и наследует её модель потоков данных: единый store, предсказуемые обновления, иммутабельные изменения и подписочная модель через React-обвязку. Это делает поведение данных формально детерминированным, но при неправильной настройке приводит к избыточным перезапросам, лишним ререндерам и разрастанию кэша.
Профилирование в RTK Query сводится к трём уровням: сетевые запросы, состояние кэша и рендеринг компонентов.
RTK Query строит работу вокруг нескольких ключевых слоёв:
createApi)Каждый слой может стать источником проблем производительности или некорректного поведения.
RTK Query полностью отражает своё состояние в Redux store под ключом:
state.api
Внутри него находятся:
queries — активные запросы и их результатыmutations — состояние мутацийprovided — теги для инвалидацииsubscriptions — активные подписки компонентовconfig — настройки API слояТипичная проблема — разрастание queries из-за
параметров, которые меняются по ссылке (object identity), например:
useGetUsersQuery({ page: 1, filter: { role: 'admin' } })
Каждый новый объект создаёт новый cache key, даже если данные эквивалентны.
RTK Query по умолчанию дедуплицирует запросы, но только при совпадении:
Ошибки часто возникают при:
serializeQueryArgsВ браузере важно отслеживать:
Особое внимание:
refetchOnFocusrefetchOnReconnectpollingIntervalЭти механизмы часто создают “невидимую нагрузку”.
RTK Query использует модель подписок: каждый useQuery
создаёт subscription в store.
Компоненты, которые часто перемонтируются, создают лишнюю нагрузку:
keyВозникает при:
В Redux DevTools можно наблюдать:
subscriptions: {
"getUsers({page:1})": {
"a1b2c3": 1
}
}
Если количество подписок растёт без причины — проблема в жизненном цикле компонентов.
Одним из ключевых механизмов контроля рендеров является
selectFromResult.
Он позволяет ограничить данные, которые триггерят ререндер:
const { user } = useGetUserQuery(id, {
selectFromResult: ({ data }) => ({
user: data?.user
})
})
Ошибка: возвращение нового объекта без мемоизации приводит к обратному эффекту.
RTK Query хранит кэш по ключу запроса. Основные проблемы:
Причины:
При неправильной работе тегов:
providesTags: ['Users']
invalidatesTags: ['Users']
Проблема возникает, если:
Механизм providesTags / invalidatesTags
может быть источником каскадных обновлений.
baseQuery — место, где часто скрываются ошибки:
Оборачивание baseQuery:
const baseQueryWithLogger = async (args, api, extraOptions) => {
console.time('request')
const result = await fetchBaseQuery({ baseUrl })(args, api, extraOptions)
console.timeEnd('request')
return result
}
Ключевые сигналы:
api/executeQuery/pendingfulfilled с одинаковыми аргументамиunsubscribe → subscribeRTK Query тесно связан с React render lifecycle.
Инструменты:
Типичная проблема:
RTK Query может выполнять refetch без явного вызова:
Особенно важно:
refetchOnMountOrArgChange: true
refetchOnFocus: true
refetchOnReconnect: true
Эти параметры часто создают “фантомную активность”.
Polling — один из наиболее дорогих механизмов.
Проблемы:
Симптом:
Для диагностики последовательно отключаются:
Это позволяет определить источник нестабильного поведения.
Ключевой фактор производительности — стабильность аргументов.
Проблемные конструкции:
useGetPostsQuery({
filters: {
search: term
}
})
Даже если term не меняется, объект пересоздаётся.
Решение на уровне архитектуры:
RTK Query проходит стадии:
pendingfulfilledrejectedremovedОтслеживание этих переходов в Redux DevTools позволяет выявить:
Основные метрики:
Эти метрики часто показывают архитектурные проблемы раньше, чем UI симптомы.
Отладка RTK Query сводится к последовательному разложению поведения:
Каждый слой изолируется до обнаружения источника нестабильности.