Zustand vs Redux 2026 比較:React 狀態管理輕量方案到底該選誰?
說真的,2026 年還在猶豫 React 狀態管理要用什麼的人,我完全能理解你的痛苦。Redux 曾經是唯一正解,但現在 Zustand React狀態管理取代Redux輕量方案2026比較 已經變成前端圈最熱門的討論話題之一。身為一個寫了五年 React 的開發者,我想跟你分享我從 Redux 轉到 Zustand 的真實心得,以及什麼情況下你可能還是需要 Redux。
為什麼 Zustand 在 2026 年這麼火?
先說結論:Zustand 之所以爆紅,不是因為它做了什麼神奇的事,而是因為它「不做」很多事。沒有 Provider wrapper、沒有 action type 字串、沒有 reducer boilerplate。對於中小型專案來說,這簡直是解放。
我第一次接觸 Zustand 是在一個 side project 裡,原本用 Redux Toolkit 管理大概十幾個 state。換成 Zustand 之後,程式碼量直接砍掉 40%,而且讀起來就像在寫普通的 JavaScript 物件,完全不需要切換「Redux 腦」。
程式碼比較:建立一個 Store
Zustand 的寫法
Zustand 建立 store 的方式非常直覺,就是一個函式回傳你的 state 和 actions:
import { create } from 'zustand'
interface TodoStore {
todos: string[]
addTodo: (todo: string) => void
removeTodo: (index: number) => void
totalCount: () => number
}
const useTodoStore = create<TodoStore>((set, get) => ({
todos: [],
addTodo: (todo) => set((state) => ({
todos: [...state.todos, todo]
})),
removeTodo: (index) => set((state) => ({
todos: state.todos.filter((_, i) => i !== index)
})),
totalCount: () => get().todos.length,
}))
// 在元件中使用
function TodoList() {
const todos = useTodoStore((state) => state.todos)
const addTodo = useTodoStore((state) => state.addTodo)
// 就這樣,沒有 Provider,沒有 dispatch
}
看到了嗎?整個 store 定義加上 TypeScript 型別,不到 20 行。而且在元件裡用的時候,直接 call hook 就好,不需要包任何 Provider。
Redux Toolkit 的寫法
同樣的功能用 Redux Toolkit 來寫:
import { createSlice, configureStore } from '@reduxjs/toolkit'
import { Provider, useSelector, useDispatch } from 'react-redux'
const todoSlice = createSlice({
name: 'todos',
initialState: { todos: [] as string[] },
reducers: {
addTodo: (state, action) => {
state.todos.push(action.payload)
},
removeTodo: (state, action) => {
state.todos.splice(action.payload, 1)
},
},
})
const store = configureStore({
reducer: { todos: todoSlice.reducer },
})
export const { addTodo, removeTodo } = todoSlice.actions
type RootState = ReturnType<typeof store.getState>
// 在元件中使用
function TodoList() {
const todos = useSelector((state: RootState) => state.todos.todos)
const dispatch = useDispatch()
// 需要 dispatch(addTodo('新任務'))
}
// 還需要在最上層包 Provider
// <Provider store={store}><App /></Provider>
Redux Toolkit 已經比原生 Redux 簡化很多了,但跟 Zustand 比起來,還是多了不少儀式感。特別是那個 Provider 和 dispatch 的模式,對新手來說就是額外的認知負擔。
Zustand Slice Pattern:大型專案也能用
很多人說 Zustand 只適合小專案,這其實是個誤解。Zustand 的 Slice Pattern 讓你可以把 store 拆分成多個模組,跟 Redux 的 slice 概念類似:
// userSlice.ts
export const createUserSlice = (set) => ({
user: null,
login: (userData) => set({ user: userData }),
logout: () => set({ user: null }),
})
// cartSlice.ts
export const createCartSlice = (set, get) => ({
items: [],
addItem: (item) => set((state) => ({
items: [...state.items, item]
})),
getTotal: () => get().items.reduce((sum, i) => sum + i.price, 0),
})
// store.ts
import { create } from 'zustand'
const useStore = create((...args) => ({
...createUserSlice(...args),
...createCartSlice(...args),
}))
這樣的架構在團隊協作時也很好維護,每個人負責自己的 slice,最後在 store 裡組合起來就好。搭配 React Compiler 的自動 memoization 功能,Zustand 的 selector 效能會更加出色。
什麼時候還是該選 Redux?
我不是 Redux 黑粉,事實上有幾種情況我還是會推薦 Redux:
- 超大型團隊(20+ 前端工程師):Redux 的嚴格結構反而是優勢,新人加入時有清晰的 pattern 可以遵循
- 需要 Redux DevTools 的進階功能:Time-travel debugging、action replay 在複雜的除錯場景真的很好用(Zustand 雖然也支援 devtools middleware,但功能沒那麼完整)
- 已有大量 Redux middleware:如果你的專案重度依賴 redux-saga 或自定義 middleware pipeline,遷移成本可能不值得
- 需要嚴格的狀態不可變性保證:Redux 的 Immer 整合讓狀態更新更安全
效能比較:誰比較快?
實際上兩者的效能差異在大多數應用中幾乎感受不到。但在微觀層面,Zustand 有幾個優勢:
- Bundle size:Zustand 只有 ~1.1KB(gzipped),Redux Toolkit + React-Redux 大約 ~11KB
- 渲染優化:Zustand 的 selector 預設就是用 shallow comparison,不需要額外設定
- 初始化速度:沒有 Provider tree,少了一層 Context 開銷
不過如果你的專案已經用了 React 19 的 useActionState 和 useOptimistic 來處理 server actions 的表單狀態,那麼你需要全域狀態管理的場景其實會更少,不管是 Zustand 還是 Redux 都只需要管理真正的「全域」狀態。
Zustand 的 Middleware 生態系
Zustand 雖然輕量,但該有的 middleware 都有:
- persist:自動把 state 存到 localStorage 或 sessionStorage
- devtools:整合 Redux DevTools 做狀態除錯
- immer:用 Immer 語法寫可變式更新
- subscribeWithSelector:更精細的訂閱控制
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'
const useStore = create(
devtools(
persist(
(set) => ({
theme: 'light',
toggleTheme: () => set((state) => ({
theme: state.theme === 'light' ? 'dark' : 'light'
})),
}),
{ name: 'theme-storage' }
)
)
)
從 Redux 遷移到 Zustand 的實戰建議
如果你決定要從 Redux 遷移,這邊分享幾個我實際走過的步驟:
- 漸進式遷移:不要一次全換,先從最簡單的 slice 開始,Redux 和 Zustand 可以共存
- 先遷移獨立的 UI 狀態:像是 modal 開關、sidebar 展開等不涉及 API 的狀態最適合先搬
- API 狀態考慮用 TanStack Query:很多 Redux 管理的其實是 server state,這部分交給 React Query 或 SWR 更合適
- TypeScript 型別要先定好:Zustand 的 TypeScript 支援很好,但 slice pattern 的型別推導需要花點功夫設計
另外,如果你的專案是用 Astro 5 Islands Architecture 這種部分水合的框架,Zustand 的無 Provider 設計會特別有優勢,因為每個 Island 都是獨立的 React 樹,全域 Context 在這種架構下很難運作。
我的最終推薦
2026 年的 Zustand React狀態管理取代Redux輕量方案2026比較,我的答案很簡單:
- 新專案:直接用 Zustand,除非你有明確的理由需要 Redux
- 既有 Redux 專案:如果運作得好就不要動,如果維護成本高才考慮遷移
- 學習階段:先學 Zustand 建立概念,之後再看 Redux 會覺得很容易理解
狀態管理工具終究只是工具,重要的是你對 React 元件設計和資料流的理解。選一個讓團隊開心的方案,然後專注在真正重要的產品功能上吧。
繼續閱讀
TanStack Query v5 完整教學:React 伺服器狀態管理與資料快取最佳實踐
相關文章
你可能也喜歡
探索其他領域的精選好文