RTK Query построен на концепции расширяемости Redux Toolkit через middleware и enhancers, которые обеспечивают автоматизацию жизненного цикла запросов, кэширование, синхронизацию состояния и интеграцию с Redux store без необходимости вручную описывать побочные эффекты.
Middleware в RTK Query является центральным механизмом, через который проходят все операции, связанные с запросами: отправка, кэширование, инвалидация, повторные запросы, подписки и очистка состояния.
Основной middleware создаётся через createApi и
подключается к Redux store автоматически как часть
api.middleware.
import { configureStore } from '@reduxjs/toolkit'
import { api } from './api'
export const store = configureStore({
reducer: {
[api.reducerPath]: api.reducer,
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(api.middleware),
})
Здесь происходит ключевое расширение store:
api.reducer управляет состоянием кэша и запросовapi.middleware перехватывает actions, связанные с
APIMiddleware RTK Query не просто обрабатывает async действия, а формирует полноценную систему управления запросами.
fetchBaseQuery или кастомный
baseQueryПри вызове:
const { data } = useGetUsersQuery()
происходит следующая цепочка:
Хук диспатчит action
api/executeQuery/pending
middleware перехватывает action
выполняется baseQuery
результат превращается в:
api/executeQuery/fulfilledapi/executeQuery/rejectedreducer обновляет cache state
подписанные компоненты получают обновление
RTK Query middleware можно рассматривать как слой оркестрации между Redux и сетевым уровнем.
Одной из ключевых функций middleware является предотвращение повторных идентичных запросов.
Если два компонента одновременно вызывают:
useGetUsersQuery()
RTK Query:
Это реализовано через внутренний registry активных запросов.
Каждый useQuery создаёт подписку на cache entry.
Middleware отслеживает:
При отсутствии подписчиков возможны действия:
RTK Query использует систему тегов для автоматического обновления данных.
getUsers: builder.query({
query: () => '/users',
providesTags: ['Users'],
})
updateUser: builder.mutation({
query: (user) => ({
url: `/users/${user.id}`,
method: 'PUT',
body: user,
}),
invalidatesTags: ['Users'],
})
Middleware выполняет:
invalidatesTagsbaseQuery — это низкоуровневая функция выполнения
запроса.
Middleware:
baseQueryRTK Query middleware автоматически использует
AbortController.
abort()Это предотвращает:
Если middleware управляет потоком действий, то enhancers модифицируют сам store.
RTK Query использует store enhancer для:
Enhancer создаётся внутри createApi и автоматически
применяется через configureStore.
Он обеспечивает:
Middleware и enhancer работают как единая система:
store enhancer → создаёт API контекст
middleware → управляет запросами в runtime
reducer → хранит cache state
RTK Query middleware работает внутри стандартного pipeline Redux middleware.
Порядок:
Важно, что порядок подключения влияет на поведение кэша и побочных эффектов.
RTK Query не ограничивает использование дополнительных middleware.
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware()
.concat(loggerMiddleware)
.concat(api.middleware)
Порядок важен:
Middleware обеспечивает корректную трассировку действий:
query initiatedquery fulfilledquery rejectedmutation initiatedКаждое событие проходит через middleware pipeline, что позволяет DevTools отображать полную цепочку запроса.
RTK Query поддерживает retry через расширения baseQuery.
Middleware управляет:
При этом retry логика остаётся изолированной от компонентов.
Middleware выполняет ряд оптимизаций:
Можно представить middleware как цикл обработки событий:
action → middleware → baseQuery → response → middleware → reducer → state update → re-render
Каждый этап строго контролируется, что обеспечивает предсказуемость поведения.
В server-side rendering сценариях middleware:
При гидрации состояния:
RTK Query middleware и enhancers формируют слой, который превращает Redux из системы управления состоянием в полноценный data-fetching engine.
Ключевые принципы: