PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Zustand vs Redux: что выбрать для React-проекта в 2025

    Zustand vs Redux: что выбрать для React-проекта в 2025

    Аватар автора Zustand vs Redux: что выбрать для React-проекта в 2025

    Антон Ларичев

    Иконка календаря12 июня 2026
    ReactZustandReduxState ManagementmiddleИконка уровня middle
    Картинка поста Zustand vs Redux: что выбрать для React-проекта в 2025

    Введение

    Управление состоянием — одна из ключевых задач при разработке React-приложений. В 2025 году выбор инструмента всё чаще сводится к двум решениям: проверенный временем Redux (в современной обёртке Redux Toolkit) и минималистичный Zustand. Оба подхода решают одну проблему, но делают это принципиально по-разному.

    В этой статье разберём архитектурные различия, синтаксис, производительность и реальные сценарии использования. Цель — помочь выбрать подходящий инструмент именно под ваш проект.

    Архитектурные различия

    Redux построен на идее однонаправленного потока данных и иммутабельности. Действия (actions) описывают, что произошло, редьюсеры — как изменилось состояние. Это даёт предсказуемость, но требует много кода-обёрток.

    Zustand отбрасывает концепцию редьюсеров и действий как обязательную. Хранилище — это просто объект с данными и методами. Подписка на изменения происходит через хук, а ререндер запускается только при изменении выбранной части состояния.

    Создание стора: Redux Toolkit

    import { createSlice, configureStore } from '@reduxjs/toolkit'
    
    // Создаём слайс с начальным состоянием и редьюсерами
    const counterSlice = createSlice({
      name: 'counter',
      initialState: { value: 0 },
      reducers: {
        increment: (state) => {
          // Immer позволяет писать мутабельный код
          state.value += 1
        },
        addBy: (state, action: { payload: number }) => {
          state.value += action.payload
        },
      },
    })
    
    export const { increment, addBy } = counterSlice.actions
    export const store = configureStore({
      reducer: { counter: counterSlice.reducer },
    })
    

    Использование в компоненте:

    import { useSelector, useDispatch } from 'react-redux'
    
    function Counter() {
      // Получаем значение из стора
      const value = useSelector((s: RootState) => s.counter.value)
      const dispatch = useDispatch()
    
      return (
        <button onClick={() => dispatch(increment())}>
          Значение: {value}
        </button>
      )
    }
    

    Создание стора: Zustand

    import { create } from 'zustand'
    
    // Типизируем состояние и методы
    type CounterState = {
      value: number
      increment: () => void
      addBy: (n: number) => void
    }
    
    export const useCounter = create<CounterState>((set) => ({
      value: 0,
      // Методы напрямую меняют состояние через set
      increment: () => set((s) => ({ value: s.value + 1 })),
      addBy: (n) => set((s) => ({ value: s.value + n })),
    }))
    

    Использование:

    function Counter() {
      // Селектор гарантирует ререндер только при изменении value
      const value = useCounter((s) => s.value)
      const increment = useCounter((s) => s.increment)
    
      return (
        <button onClick={increment}>
          Значение: {value}
        </button>
      )
    }
    

    Разница очевидна: меньше файлов, меньше абстракций, нет необходимости в Provider.

    Асинхронные операции

    В Redux Toolkit для асинхронной логики используют createAsyncThunk или RTK Query. Это мощный инструмент с кешированием, инвалидацией и встроенной обработкой состояний загрузки.

    import { createAsyncThunk } from '@reduxjs/toolkit'
    
    export const fetchUser = createAsyncThunk(
      'user/fetch',
      async (id: string) => {
        const res = await fetch(`/api/users/${id}`)
        return res.json()
      },
    )
    

    В Zustand нет встроенных средств для асинхронности — но они и не нужны. Любой метод стора может быть async:

    export const useUser = create<UserState>((set) => ({
      user: null,
      loading: false,
      fetchUser: async (id: string) => {
        set({ loading: true })
        const res = await fetch(`/api/users/${id}`)
        // После запроса обновляем состояние
        set({ user: await res.json(), loading: false })
      },
    }))
    

    Для сложного кеширования с Zustand обычно комбинируют его с TanStack Query.

    Производительность

    Zustand выигрывает в простых сценариях за счёт точечных подписок: ререндерится только тот компонент, чей селектор вернул новое значение. Redux с useSelector работает аналогично, но дополнительные слои (middleware, devtools) создают накладные расходы.

    В бенчмарках на 10 000 элементов разница между ними обычно в пределах погрешности. Решающим становится корректное использование селекторов, а не выбор библиотеки.

    Когда выбрать Redux

    Redux Toolkit стоит брать, если:

    • В команде уже есть опыт с Redux и налаженный workflow
    • Нужны строгие гарантии предсказуемости и аудит изменений
    • Активно используется RTK Query для работы с API
    • Проект большой, с десятками доменов состояния

    Когда выбрать Zustand

    Zustand подходит для:

    • Стартапов и MVP, где важна скорость разработки
    • Средних SPA с локальным состоянием в нескольких сторах
    • Проектов, где сервер-стейт уже закрыт через TanStack Query или SWR
    • Команд, которым важна минимальная кривая входа

    Частые ошибки

    Селектор возвращает новый объект на каждом рендере. В обеих библиотеках это вызывает лишние ререндеры. Используйте shallow или примитивные селекторы.

    // Плохо: новый объект на каждом рендере
    const { a, b } = useStore((s) => ({ a: s.a, b: s.b }))
    
    // Хорошо: два отдельных селектора
    const a = useStore((s) => s.a)
    const b = useStore((s) => s.b)
    

    Хранение серверного состояния в клиентском сторе. И Redux, и Zustand плохо приспособлены для кеширования запросов. Используйте RTK Query или TanStack Query.

    Глобализация всего подряд. Не каждое состояние должно жить в сторе. Локальный useState часто остаётся лучшим выбором.

    Игнорирование иммутабельности в Zustand. Хотя библиотека не заставляет писать иммутабельный код, прямые мутации могут привести к багам подписок.

    Заключение

    В 2025 году нет единственно правильного выбора. Redux Toolkit остаётся отличным решением для крупных корпоративных проектов с устоявшимися практиками. Zustand завоёвывает рынок там, где ценят простоту и скорость.

    Практичный подход: для нового проекта без жёстких требований берите Zustand плюс TanStack Query — это покрывает 90% задач при минимуме кода. Если же у вас уже есть инфраструктура на Redux, миграция ради миграции не нужна — обе библиотеки прекрасно справляются со своей работой.

    Иконка глаза384

    Комментарии

    0

    Постройте личный план изучения React state менеджер Zustand до уровня Middle — бесплатно!

    React state менеджер Zustand — часть карты развития Frontend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Vue 3 и Pinia

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Next.js - с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.7
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Feature-Sliced Design

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.5
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Серверные компоненты Next.js: внутреннее устройство
    Иконка аватараАнтон
    Иконка календаря09 июля 2026
    Next.jsReactServer Components+ 2middleИконка уровня middle

    Серверные компоненты Next.js: внутреннее устройство

    Серверные компоненты Next.js выполняются только на сервере, уменьшают JS-бандл и передают данные через RSC Payload. Разбираем, как это работает изнутри.

    Иконка чипа0
    Иконка глаза92
    Иконка комментариев0
    Картинка поста GraphQL vs REST: что выбрать для API в 2026 году
    Иконка аватараАнтон
    Иконка календаря11 июля 2026
    graphqlrestapi+ 3middleИконка уровня middle

    GraphQL vs REST: что выбрать для API в 2026 году

    GraphQL vs REST — разбираем ключевые отличия, сценарии применения и подводные камни каждого подхода, чтобы выбрать правильный инструмент для вашего проекта.

    Иконка чипа0
    Иконка глаза43
    Иконка комментариев0
    Картинка поста Тестирование React-компонентов с React Testing Library
    Иконка аватараАнтон
    Иконка календаря07 июля 2026
    reacttestingreact-testing-library+ 2middleИконка уровня middle

    Тестирование React-компонентов с React Testing Library

    React Testing Library — инструмент для тестирования React-компонентов через поведение пользователя, а не детали реализации. Примеры, паттерны, частые ошибки.

    Иконка чипа0
    Иконка глаза162
    Иконка комментариев0
    Иконка чипа0