Управление Server State
Определение
Server State - это снимок (snapshot) данных, полученных с сервера в конкретный момент времени.
Ключевые свойства Server State:
- данные могут устаревать
- данные могут изменяться вне клиента
- клиент не является источником истины
Цель слоя Server State
Слой Server State отвечает за:
- управление жизненным циклом серверных данных (fetch/refetch/retry)
- кеширование и дедупликацию запросов
- контроль актуальности данных (staleTime/cacheTime)
- синхронизацию данных с UI
Библиотеки
Для управления Server State используем специализированные библиотеки:
- TanStack Query
- SWR
- RTK Query (в связке с Redux Toolkit)
Запрещено хранить Server State в Zustand/MobX и т.п. - это client state менеджеры.
Архитектура в FSD
В рамках Feature-Sliced Design код, связанный с запросами, локализуется на уровне доменного модуля, но разделяется по ответственности.
Слои и ответственность
1) entities/*/api и features/*/api
Назначение: описывать контракт доступа к серверу.
MUST (разрешено):
- функции вызова API (обертки над
shared/api) - query factories (
queryKey+queryFn) - описание endpoint’ов сущности/фичи
FORBIDDEN:
- React-код
- управление жизненным циклом (refetch/retry policies)
- cache invalidation логика
- работа с QueryClient
Примеры
1.1 ✅ Хорошо
// entities/user/api/user.api.ts
import { http } from '@/shared/api/http';
import type { UserDto } from '@/shared/types/dto';
export function fetchUserById(userId: string, signal?: AbortSignal) {
return http.get<UserDto>(`/users/${userId}`, { signal });
}
1.2 ✅ Хорошо (query factory)
// entities/user/api/user.queries.ts
import { fetchUserById } from './user.api'; // импорт API-метода для получения данных о пользователе (пример #1)
export const userQuery = (userId: string) => ({
queryKey: ['user', userId] as const,
queryFn: ({ signal }: { signal?: AbortSignal }) => fetchUserById(userId, signal)
});