RTK Query входит в экосистему библиотеки Redux Toolkit и предназначен для управления серверным состоянием, кэшированием, синхронизацией данных и автоматизацией сетевых запросов.
Перед интеграцией RTK Query необходимо понимать, какие зависимости требуются проекту, какие версии библиотек совместимы между собой и какие технические условия должны соблюдаться для стабильной работы.
RTK Query ориентирован на современную Javascript-инфраструктуру. Минимальные требования зависят от используемого сборщика, версии React и конфигурации проекта.
| Компонент | Рекомендуемая версия |
|---|---|
| Node.js | 16+ |
| npm | 8+ |
| React | 18+ |
| Redux Toolkit | 2+ |
| Redux | 5+ |
| Typescript | 5+ (при использовании TS) |
RTK Query официально поддерживает:
RTK Query встроен внутрь Redux Toolkit и не требует отдельного пакета.
Установка:
npm install @reduxjs/toolkit
или:
yarn add @reduxjs/toolkit
После установки становятся доступны:
Для интеграции RTK Query с React требуется библиотека React Redux.
Установка:
npm install react-redux
или:
yarn add react-redux
Без React Redux невозможно:
Для React-проекта обычно достаточно:
npm install @reduxjs/toolkit react-redux
RTK Query уже находится внутри Redux Toolkit:
import { createApi } from '@reduxjs/toolkit/query/react'
Отдельный пакет устанавливать не требуется.
RTK Query имеет два основных entry point:
import { createApi } from '@reduxjs/toolkit/query'
Используется:
import { createApi } from '@reduxjs/toolkit/query/react'
Дополнительно генерирует:
Именно этот вариант используется в большинстве React-приложений.
RTK Query по умолчанию использует fetchBaseQuery, основанный на Fetch API.
Пример:
import { fetchBaseQuery } from '@reduxjs/toolkit/query/react'
Следовательно, окружение должно поддерживать:
RTK Query корректно работает во всех современных браузерах:
| Браузер | Поддержка |
|---|---|
| Chrome | Полная |
| Firefox | Полная |
| Edge | Полная |
| Safari | Полная |
Проблемы возникают в:
Если Fetch API отсутствует, требуется polyfill.
Популярные варианты:
npm install cross-fetch
npm install whatwg-fetch
Пример:
import 'cross-fetch/polyfill'
или:
import 'whatwg-fetch'
После этого fetchBaseQuery сможет работать в старых окружениях.
RTK Query активно использует отмену запросов.
Пример внутренних механизмов:
signal.abort()
Поэтому окружение обязано поддерживать:
AbortController
Для старых браузеров может понадобиться polyfill:
npm install abortcontroller-polyfill
Для старых браузеров проект обычно использует Babel.
Минимальная конфигурация:
{
presets: ['@babel/preset-env']
}
Для React:
{
presets: [
'@babel/preset-env',
'@babel/preset-react'
]
}
RTK Query глубоко интегрирован с Typescript.
Рекомендуемые параметры:
{
"compilerOptions": {
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true
}
}
RTK Query активно использует:
Без strict mode появляются:
RTK Query поддерживает:
| Формат | Поддержка |
|---|---|
| ESM | Да |
| CommonJS | Да |
Современные сборщики предпочитают ESM.
Для Vite достаточно стандартной конфигурации.
Установка:
npm install vite
React-шаблон:
npm create vite@latest
RTK Query полностью совместим с:
Минимально рекомендуется:
| Компонент | Версия |
|---|---|
| webpack | 5+ |
| babel-loader | 9+ |
RTK Query корректно работает с:
RTK Query поддерживает:
Минимально рекомендуется:
npm install next react react-dom
Дополнительно:
npm install react-redux @reduxjs/toolkit
Для SSR важно учитывать:
Иногда требуется node-fetch:
npm install node-fetch
RTK Query работает в React Native благодаря встроенному fetch.
Требуются:
npm install @reduxjs/toolkit react-redux
Дополнительных HTTP-клиентов обычно не требуется.
RTK Query не требует Axios.
По умолчанию используется:
fetchBaseQuery
Однако Axios может применяться:
При необходимости:
npm install axios
Пример кастомного baseQuery:
const axiosBaseQuery =
({ baseUrl } = { baseUrl: '' }) =>
async ({ url, method, data, params }) => {
try {
const result = await axios({
url: baseUrl + url,
method,
data,
params,
})
return { data: result.data }
} catch (axiosError) {
return {
error: {
status: axiosError.response?.status,
data: axiosError.response?.data,
},
}
}
}
Основные peer dependencies:
| Пакет | Назначение |
|---|---|
| react | UI |
| react-dom | DOM rendering |
| react-redux | интеграция Redux |
| redux | store |
Команда:
npm list
или:
npm ls @reduxjs/toolkit
Особенно важно избегать:
Типичная проблема:
Invalid hook call
Причина часто связана с дублирующимся React.
Пример:
{
"dependencies": {
"@reduxjs/toolkit": "^2.2.0",
"react": "^18.3.0",
"react-dom": "^18.3.0",
"react-redux": "^9.1.0"
}
}
Часто используются:
{
"devDependencies": {
"typescript": "^5.5.0",
"eslint": "^9.0.0",
"prettier": "^3.0.0"
}
}
RTK Query не требует специальных ESLint-плагинов.
Но полезны:
npm install eslint-plugin-react-hooks
и:
npm install @typescript-eslint/eslint-plugin
React 18 StrictMode вызывает двойной mount в development.
Это влияет на:
Пример:
<React.StrictMode>
<App />
</React.StrictMode>
RTK Query корректно поддерживает StrictMode.
Store обязательно должен:
Минимальная конфигурация:
import { configureStore } from '@reduxjs/toolkit'
import { api } from './api'
export const store = configureStore({
reducer: {
[api.reducerPath]: api.reducer,
},
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(api.middleware),
})
Middleware отвечает за:
Без middleware RTK Query работать не будет.
Redux Toolkit по умолчанию включает serializableCheck.
RTK Query старается хранить сериализуемые данные.
Нежелательно помещать в cache:
RTK Query использует иммутабельный state.
Запрещены:
state.user.name = 'John'
Разрешено:
return {
...state,
user: {
...state.user,
name: 'John'
}
}
Хотя Immer внутри Redux Toolkit автоматизирует этот процесс, понимание ограничений остаётся важным.
RTK Query рассчитан на HTTP API:
| Тип API | Поддержка |
|---|---|
| REST | Отлично |
| GraphQL | Через custom baseQuery |
| gRPC | Ограниченно |
| WebSocket | Частично |
Для GraphQL часто используют:
npm install graphql-request
или:
npm install @apollo/client graphql
Хотя RTK Query может работать и без Apollo.
RTK Query не заменяет WebSocket-клиент.
Обычно дополнительно используются:
npm install socket.io-client
или:
npm install ws
RTK Query поддерживает injectEndpoints.
Это позволяет:
Особенно полезно в:
RTK Query рассчитан на:
Однако проект должен избегать:
Большое количество cache entries может приводить к:
Для контроля используются:
keepUnusedDataFor
и:
refetchOnMountOrArgChange
Часто используется следующий стек:
npm install \
@reduxjs/toolkit \
react-redux \
react \
react-dom
Дополнительно:
npm install axios
npm install zod
npm install graphql-request
npm install socket.io-client
Но эти библиотеки являются опциональными и зависят от архитектуры проекта.