Вопрос, который определяет ваш стек управления состоянием
Хватит сравнивать Redux с React Query.
Это всё равно что спрашивать, нужен ли вам молоток или отвёртка, прежде чем вы поймёте, что именно собираетесь строить. Redux, React Query и Zustand решают разные задачи.
Настоящее решение проистекает из одного вопроса: Кто является владельцем «источника истины» (source of truth) для каждого фрагмента состояния?
У вас есть два типа истины.
- Собственная истина (Owned Truth) Источником является клиент. Сюда входят такие вещи, как:
- Открыта ли боковая панель?
- Какая сейчас тема?
- Какой шаг формы активен? Это состояние живет и умирает по вашим локальным решениям. Ему не нужно повторно подтверждать себя на сервере.
- Заимствованная истина (Borrowed Truth) Источник находится на сервере. Клиент лишь хранит «зеркало» этих данных. Эти данные могут меняться без вашего ведома. Ваша задача — управлять:
- Устареванием (Staleness)
- Инвалидацией (Invalidation)
- Повторным получением (Refetching)
- Кэшированием (Caching)
Большинство разработчиков испытывают трудности, потому что используют один инструмент для обоих случаев. Когда вы пытаетесь управлять заимствованной истиной в клиентском редьюсере (reducer), вы в итоге начинаете плохо переписывать React Query. Вы вручную пишете состояния загрузки, обработку ошибок и кэширование. Это порождает огромное количество лишнего кода.
Разделите их, чтобы победить.
Используйте React Query для заимствованной истины. Он берет на себя сложную работу по синхронизации. Используйте Zustand для собственной истины. Он обеспечивает простое хранение значений без лишних церемоний.
Не сваливайте серверные данные в Zustand. Держите эту границу четкой.
А как же Redux и Sagas? Sagas предназначены не для получения данных. Они нужны для оркестрации сложных процессов во времени. Используйте их, если ваше приложение работает с:
- Параллельными, отменяемыми потоками (flows).
- Потоками WebSocket в реальном времени.
- Сложными конечными автоматами (state machines).
Если вы используете React Query, а ваши Sagas ничего не делают, они вам не нужны.
Есть третий путь: Унификация. RTK Query и Redux позволяют держать всё в одном сторе (store). Это дает вам единый снимок (snapshot) всего вашего приложения. Это значительно упрощает отладку, выход из системы и обеспечение работы в офлайн-режиме.
Выбирайте свой путь в зависимости от потребностей:
- React Query + Zustand: Лучший выбор для небольших команд, которым важна низкая сложность.
- Redux + Sagas: Лучший выбор для высоконагруженных доменов, таких как торговые приложения.
- Только RTK: Лучший выбор для крупных корпоративных команд, которым нужен единый источник истины.
Прежде чем выбирать инструмент, спросите себя: нужно ли этому состоянию вообще жить на клиенте? Server Components возвращают значительную часть этой логики на сервер.
Сначала выясните, кто владеет истиной. Инструмент подберется сам.