1. はじめに
Reactにおける状態管理の重要性
Reactコンポーネントは、内部状態を管理するために useState や useReducer などのフックを提供しますが、大規模なアプリケーションや複雑なコンポーネントツリーにおいては、状態の共有が課題となります。特に、props を介して状態を深くネストしたコンポーネントに передавать する「プロップドリリング」は、コードの可読性や保守性を低下させる可能性があります。状態管理ライブラリは、このような課題を解決し、アプリケーション全体で一貫した状態管理を実現するために重要な役割を果たします。
状態管理ライブラリの選択肢としてのReduxとZustand
Redux は、その長い歴史 (1) と確立された地位により、Reactのエコシステムにおいて長らく標準的な選択肢でした (2). これは、アプリケーションの状態を予測可能に管理するための JavaScript ライブラリであり (3)、大規模で複雑なアプリケーションにおいて、その堅牢性と予測可能性が評価されてきました (2). 一方、よりシンプルで高性能な代替手段として Zustand が登場し、注目を集めています (2). Zustand は、簡潔な API (2) とフックベースのインターフェース (6) を提供し、高速でスケーラブルな状態管理ソリューションとして、特に中小規模のアプリケーションや迅速なプロトタイピングに適しています (2). 本記事では、これらの主要な二つのライブラリに焦点を当て、それぞれの特徴と使い分けについて深く掘り下げていきます。
本記事の目的と範囲
本記事の目的は、Redux と Zustand の基本的な概念、アーキテクチャ、API、および使用方法を詳細に解説し、比較することです。それぞれのライブラリの利点と欠点を明確にすることで、読者が自身のプロジェクトの要件やチームの好みに基づいて、最適な状態管理ライブラリを選択できるよう支援します。また、基本的な使用方法をコード例で示すことで、具体的な実装イメージを提供します。



2. Redux: 予測可能な状態管理
Reduxの基本概念
Redux は、アプリケーションの状態を単一のストアで集中管理し、アクションを介して状態を変更し、リデューサーがそのロジックを定義するという、明確なパターンに基づいた状態管理ライブラリです 7。このセクションでは、Redux の主要な概念であるストア、アクション、リデューサー、ミドルウェアについて、その仕組みと役割を詳しく解説します。
ストア (Store) の仕組みと役割
Redux ストアは、アプリケーション全体の状態を保持する唯一の情報源です (8). これは、アプリケーションの状態、アクション、およびリデューサーを一つにまとめる中心的なコンポーネントであり (8)、アプリケーションの「脳」のような役割を果たします (4). ストアは、createStore 関数(または Redux Toolkit の configureStore 関数)を使用して作成されます (8). ストアの現在の状態には getState() メソッドを介してアクセスでき (8)、状態を更新するには dispatch(action) メソッドを使用してアクションをディスパッチします (8). また、subscribe(listener) メソッドを使用してリスナーコールバックを登録すると、状態が更新されるたびにこれらのリスナーが通知されます (8). 複数の独立したストアを作成する代わりに、データ処理ロジックを分割したい場合は、リデューサーの合成を使用し、combineReducers などのユーティリティ関数で複数のリデューサーを結合して単一のルートリデューサーを作成します (8). Redux アプリケーションは常に単一のストアを持ち (8)、ストアはアプリケーションの状態を持つ不変なオブジェクトツリーとして機能します (9). ストアが作成される際には、状態の更新方法を定義するリデューサーを指定する必要があります (9). createStore 関数は、リデューサー、オプションの初期状態 (preloadedState)、およびストアの機能を拡張するためのオプションのエンハンサーを引数として取ることができます (9). ストアは、状態へのアクセス、状態の更新、そして状態の変化に対する反応という、状態管理の中核的な責任を担っています 8。
アクション (Action) の仕組みと役割
アクションは、アプリケーション内で発生したイベントや状態の変化を記述するプレーンな JavaScript オブジェクトです (13). すべてのアクションは、実行されるアクションの種類を示す type プロパティを持つ必要があります (11). アクションは、アプリケーションからストアへ情報を運ぶ唯一の情報源であり (14)、ストアへのデータの投入は最終的にアクションとしてディスパッチされる必要があります (11). type 属性に加えて、アクションオブジェクトはオプションで payload プロパティを含むことができ、これを使用してアクションに関する追加データを伝達します (13). アクションオブジェクトの構造は開発者に完全に委ねられていますが、アクションオブジェクトはできるだけ軽量に保ち、必要な情報のみを渡すことが推奨されます (14). アクションは、store.dispatch() 関数を使用してディスパッチされることで、ストア内の状態変化を引き起こします (14). アクションクリエイターは、アクションオブジェクトの作成プロセスをカプセル化する関数であり、プレーンな JavaScript オブジェクトであるアクションを返します (14). アクションクリエイターを使用することで、コードの再利用性と可読性が向上します (14). アクションは、アプリケーションのイベントを抽象化し、状態管理プロセスを開始する役割を果たします 13。
リデューサー (Reducer) の仕組みと役割
リデューサーは、アクションに応じてアプリケーションの状態がどのように変化するかを決定する純粋な関数です (13). リデューサー関数は、現在の状態 (state) とディスパッチされたアクション (action) を引数として受け取り、新しい状態 (newState) を返します (12). リデューサーは純粋関数であることが重要であり、副作用がなく、同じ入力に対して常に同じ出力を返す必要があります (13). リデューサーは既存の状態を直接変更するのではなく、既存の状態をコピーして変更を加えた新しい値を返すことで、不変な更新を行う必要があります (13). Redux アプリケーションは通常、状態オブジェクトをキーごとに複数の「スライス」または「ドメイン」に分割し、個々のデータスライスを管理するために個別のリデューサー関数を提供します (12). これらの個々のリデューサー関数は、combineReducers などのユーティリティ関数を使用して単一のルートリデューサー関数に結合されます (8). リデューサーは状態更新ロジックの核心であり、純粋関数であることによって予測可能性とテスト容易性を保証します 13。リデューサーは、アクションに基づいて状態を更新するロジックを集中管理し、アプリケーションの状態遷移を明確にします。
ミドルウェア (Middleware) の仕組みと役割
ミドルウェアは、アクションがディスパッチされてからリデューサーに到達するまでの間に、処理を傍受して拡張するためのメカニズムを提供します (8). これは、アクションとリデューサーの間に位置する関数であり (18)、ロギング、クラッシュレポート、非同期 API 呼び出し、ルーティングなど、さまざまな目的で使用できます (19). applyMiddleware 関数は、ストアの作成時にミドルウェアを適用するために使用されます (19). ミドルウェアは、ストアの dispatch メソッドをラップするパイプラインを形成し (8)、store.dispatch(action) が呼び出されると、実際にはパイプラインの最初のミドルウェアが呼び出されます (8). 各ミドルウェアは、アクションが特定のタイプであるかどうかを確認し、必要に応じてカスタムロジックを実行し、そうでなければアクションをパイプラインの次のミドルウェアに渡します (8). Redux ミドルウェアは、3 つのネストされた関数として記述されるパターンに従います (8). redux-thunk や redux-saga などのミドルウェアはコミュニティによって作成され、Redux コアにはデフォルトで含まれていません (11). ミドルウェアを使用することで、アクションに対する副作用を作成したり、アクションを変更またはキャンセルしたり、dispatch によって受け入れられる入力を変更したりできます (21). 最も一般的なユースケースは副作用の作成であり、Redux-Saga、redux-observable、RTK listener middleware などがその例です (21). ミドルウェアは、非同期処理やその他の「副作用」を構造的に扱うための強力なメカニズムを提供します 19。
Reduxの利点
Redux は、そのアーキテクチャと設計原則により、多くの利点を提供します。
予測可能性
Redux は、アプリケーションが一貫して動作し、さまざまな環境で実行でき、テストしやすいように設計されています (3). これは、単一方向のデータフロー (22)、アクションによるすべての状態変更の開始 (23)、および純粋なリデューサーによる決定論的な状態更新 (23) によって実現されます。この予測可能性により、アプリケーションの状態がいつ、どこで、なぜ、どのように変化したかを理解することが容易になります (8). Redux は、状態の変更を予測可能かつ透過的にすることで、アプリケーションの理解と保守を容易にすることを目指しています (19).
デバッグの容易さ
Redux は、Redux DevTools の使用を容易にするように設計されており、ディスパッチされたアクションの履歴、それらのアクションの内容、および各ディスパッチされたアクション後の状態の変化を表示するアドオンです (8). Redux DevTools を使用すると、すべての状態とアクションペイロードを検査したり、アクションをキャンセルして過去に戻ったり、リデューサーコードを変更した場合に各ステージングされたアクションを再評価したりできます (25). また、時間を遡って状態をデバッグしたり、ライブ編集を行ったりすることも可能です (25). Redux DevTools は、Redux アプリケーションのデバッグプラットフォームを提供し、時間旅行デバッグとライブ編集を可能にします (25).
集中管理された状態管理
Redux の主な利点の 1 つは、集中管理された状態管理です (26). React アプリケーションでは、状態は通常コンポーネントレベルで管理されますが、アプリケーションの成長に伴い、このアプローチは散在し、追跡が困難な状態につながる可能性があります (26). Redux は、アプリケーションの状態を単一の情報源であるストアに集中化することで、この問題を解決します (10). これにより、アプリケーション全体の状態を把握しやすくなり (29)、コンポーネント間の状態共有が簡略化されます (27).
大規模なエコシステム
Redux のコアは小さく (依存関係を含めて 2kB)、豊富なアドオンのエコシステムがあります (3). Redux Toolkit は、Redux ロジックを記述するための公式推奨アプローチであり、Redux コアをラップし、Redux アプリケーションの構築に不可欠と考えられるパッケージと関数を含んでいます (3). Redux は、React と組み合わせて、または他の任意のビューライブラリと組み合わせて使用できます (3). Redux Toolkit は、推奨されるベストプラクティスを組み込み、ほとんどの Redux タスクを簡略化し、一般的な間違いを防ぎ、Redux アプリケーションをより簡単に記述できるようにします (3).
大規模アプリケーションへの適性
Redux は、多数の場所で必要となる大量のアプリケーション状態がある場合、アプリケーション状態が頻繁に更新される場合、その状態を更新するロジックが複雑になる可能性がある場合、およびアプリケーションが中規模または大規模なコードベースを持ち、多くの人が作業する可能性がある場合に最も役立ちます (30). Redux は、大規模な Web アプリケーションの状態を管理するのを容易にします (30). これは、メンバーシップサイト、ソーシャルネットワーク、または e コマースサイトなど、多くのコンポーネントが同じ状態を共有する必要がある場合に必要です (30). Redux は、アプリケーションの状態をグローバル変数であるストアに保存するのに役立ちます (30).
Reduxの欠点
Redux は強力な状態管理ライブラリですが、いくつかの欠点も存在します。
学習曲線
Redux の欠点の 1 つは、特にライブラリを初めて使用する開発者にとって、学習曲線が急峻であることです (33). これは、Redux がリデューサー、アクション、ミドルウェアなど、いくつかの新しい概念を導入するため、以前にライブラリを使用したことがない人にとっては馴染みがない可能性があるためです (33). また、Redux での状態管理の方法は、通常 React アプリケーションで行われる方法とは異なるため、後者に慣れている開発者にとっては混乱を招く可能性があります (33).
ボイラープレートの多さ
Redux を使用すると、アプリケーションに複雑さが増す可能性があります (33). これは、Redux がアプリケーションの実際の UI を構成するコンポーネントに加えて、個別のリデューサー関数、アクションクリエイター、および場合によってはミドルウェアとセレクターの作成を必要とするためです (33). これにより、特に大規模なプロジェクトでは、アプリケーション全体の構造とフローを理解するのが難しくなる可能性があります (33). Redux のもう 1 つの欠点は、多くのボイラープレートコードが必要になることです (36). アクション、リデューサー、ストアを作成するためのコードを記述する必要があります (36). これは時間がかかり、アプリケーションで何が起こっているかを理解するのが難しくなる可能性があります (36).
シンプルなタスクには複雑になりがち
すべてを Redux に保存することが常に良い習慣であるとは限りません (37). Redux は状態を整理するための貴重なツールですが、それが状況に適しているかどうかを検討する必要もあります (3). たとえば、作成した新しいページには、ローカル状態を渡すためにいくつかの props ドリリングを行う 8 つのサブコンポーネントを持つページコンポーネントが含まれています (37). このような場合、すべての状態とフェッチ関数をデフォルトで Redux に保存する必要があるかどうかは疑問です (37).
3. Zustand: シンプルで高性能な状態管理
Zustandの基本概念
Zustand は、React アプリケーションのための小さく、高速で、スケーラブルなベアボーン状態管理ソリューションです (1). Zustand は、フックに基づいた快適な API を持っています (38). ボイラープレートも少なく、意見の押し付けもありませんが、明示的で Flux ライクにするのに十分な規約があります (38).
ストアの作成 (Store Creation) の仕組みと役割
Zustand では、最小限のコードでストアを確立し、アプリケーションの状態の管理を開始できます (39). ストアを作成する最初のステップは、Zustand の create 関数を使用することです (39). このストアは、bears に関連する状態と関数を管理します (39). create を使用すると、API ユーティリティが添付された React Hook を作成できます (40). createStore を使用すると、API ユーティリティを公開するバニラ ストアを作成できます (39). create 関数は、set 関数、get 関数、およびストアを引数として取る stateCreatorFn を受け取ります (40). 通常、公開したいメソッドを持つオブジェクトを返します (40). set 関数は状態を更新するために使用され、デフォルトでは浅いマージを実行します (40). get 関数を使用すると、現在の状態にアクセスできます (40). Zustand はコンテキストプロバイダーを必要としません (40).
スライス (Slice) の仕組みと役割
ストアが大きくなり、機能を追加するにつれて維持が困難になる可能性があるため、メインストアをより小さく個別のストアに分割して、モジュール性を実現できます (44). これは Zustand では簡単に行えます (44). スライスは、状態の一部とその部分のアクションを返す単なる関数です (45). たとえば、「traveler」スライスがある場合、次のようになります (45):
TypeScript
export type ApplicationTravelerSliceState = {
travelers: Record<number, { passportNumber: string; name: string; /*... */ }>;
travelerErrors: Record<number, string>;
};
export type ApplicationTravelerSliceActions = {
addTraveler: (travelerData: { name: string; passportNumber: string }) => void;
removeTraveler: (id: number) => void;
};
export type ApplicationTravelerSlice = ApplicationTravelerSliceState & ApplicationTravelerSliceActions;
// スライスは、その結合された形状を返す関数です。
export const createApplicationTravelerSlice: StateCreator</* あなたのストアタイプ */, /* 使用するミドルウェア */,, ApplicationTravelerSlice> = (set, get) => ({
travelers: {},
travelerErrors: {},
addTraveler: (travelerData) => {
const nextId = Object.keys(get().travelers).length + 1;
set((state) => {
state.travelers[nextId] = travelerData;
});
},
removeTraveler: (id) => {
set((state) => {
delete state.travelers[id];
});
},
});
複数のスライスがある可能性が高く、「アプリケーションスライス」や「保険スライス」などがあります (45). 各スライスは、状態の型、アクションの型、および結合されたスライス型をエクスポートし、スライスを構成する初期化関数を含みます (45). 複数のスライスは、最終的なアグリゲーターで結合されます (45).
Zustandの利点
Zustand は、そのシンプルさと使いやすさから、多くの開発者に支持されています。
シンプルさと使いやすさ
Zustand は、アプリケーションの状態を処理するための機敏で適応性のある方法を提供する React 状態管理ライブラリとして際立っています (39). Zustand は、アプリケーションの状態をカプセル化し、状態変更のためのアクションを定義するストア中心のモデルを採用しています (39). Zustand の優雅さは、その単純さを通して明らかになります (39). 最小限のコードで、ストアを確立し、アプリケーションの状態の管理を開始できます (39). Zustand の API はシンプルで直感的であり、Redux のようなアクション、リデューサー、ミドルウェアは必要ありません (46).
ボイラープレートの少なさ
Zustand は、状態管理に必要なボイラープレートコードの量を最小限に抑え、簡潔で焦点を絞った API を提供します (39). Redux や Context API とは異なり、Zustand は最小限のセットアップが必要です (43). 複数のリデューサー、アクションタイプ、またはコンテキストを定義する必要はありません (43). Redux と比較して、Zustand は必要なコードの量を大幅に削減します (5).
高いパフォーマンス
Zustand は、パフォーマンスを念頭に置いて構築されています (48). 不要な再レンダリングを避け、アプリケーションが高速かつ応答性を維持するようにします (48). Zustand は、状態の変更を追跡し、必要な場合にのみコンポーネントを再レンダリングするために、プロキシベースのシステムを使用しています (2). Zustand は軽量であり、コンポーネントが必要な状態の一部のみをサブスクライブできるようにすることで、不要な再レンダリングを最小限に抑えます (5).
柔軟性
Zustand は、グローバルとローカルの両方の状態管理に使用できます (48). アプリケーションのニーズに最適な方法で状態を管理できます (48). Zustand を使用すると、必要に応じてストアを簡単に結合または分割できます (6). Zustand は非常に柔軟でスケーラブルであり、そのシンプルさは能力を犠牲にしていません (49). 複雑な状態管理も容易に処理できます (49).
軽量であること
Zustand は非常に軽量で、gzip 圧縮後 1KB 未満です (50). Zustand は、バンドルサイズが小さく、パフォーマンスが最適化されています (43). Zustand は外部依存関係に依存していません (43).
Zustandの欠点
Zustand は多くの利点を持つ一方で、いくつかの欠点も存在します。
Reduxと比較して小規模なエコシステム
Zustand は他のライブラリと組み合わせて使用できますが、Redux と比較してエコシステムは小さいです (51). Zustand のエコシステムは Redux ほど幅広く、深くない可能性があり、その結果、サードパーティ製のツールやライブラリが少なくなる可能性があります (52). Redux は、豊富なライブラリ、チュートリアル、リソースを備えた、はるかに大きなコミュニティを持っています (2).
非常に大規模なアプリケーションには構造化が難しい可能性
Zustand はシンプルであるため、大規模で複雑なアプリケーションの状態管理には理想的ではない可能性があります (52). Redux は、アクション、リデューサー、ミドルウェアを備えた構造により、大規模プロジェクトでのコードの整理が容易になります (2).
React Hooksの知識が前提となる
Zustand は React フックを利用しているため、フックの概念を理解している必要があります (53). React のフックに慣れていない場合は、Zustand を効果的に利用する前にフックについて理解する必要があるかもしれません (53).
4. ReduxとZustandの比較
Redux と Zustand はどちらも React アプリケーションの状態管理に広く使用されていますが、そのアーキテクチャ、API、および使用方法にはいくつかの重要な違いと類似点があります。
アーキテクチャ
Redux は、アプリケーションのグローバル状態を予測可能に管理するためのライブラリであり、状態は React の外部に保存されます (54). Redux は単一のストアを使用してアプリケーションのすべての状態を保持します (2). 状態はアクションを通じて更新され、リデューサーがそれらの更新をどのように処理するかを決定します (2). この単一方向のデータフローは、アプリケーションの状態変化を追跡しやすく、予測可能性を高めます (4).
Zustand は、主に React で使用される、簡素化された状態管理ソリューションです (1). Redux との最も明白な比較点は Redux ですが、Zustand は多くのアーキテクチャ上の利点を維持しながら、多くの儀式的な記述を排除しています (1). Zustand の最大の強みの 1 つは、Redux と比較して、最小限のボイラープレートで複数の独立したストアを作成できることです (1). Redux は複数のスライスを持つ単一のストアを推奨していますが、Zustand のアプローチでは、より自然な関心の分離が可能です (1). Zustand は、グローバルとローカルの両方の状態管理に使用でき (43)、Redux のような厳格なパターンを強制しません (45).
API
Redux は、特に Redux Toolkit (RTK) を使用すると、より構造化されたアプローチを採用します (50). Redux Toolkit は、Redux ロジックを記述するための公式推奨方法です (47). 多くの側面を簡略化し、Redux を効率的に使用しやすくします (47). Redux Toolkit は、ストアのセットアップ、リデューサーとアクションの作成、不変な更新の処理を簡略化するためのユーティリティを提供します (56).
Zustand の API は最小限であり、単一の関数でストアを作成できます (2). Zustand の API はシンプルで直感的であり、Redux のようなアクション、リデューサー、ミドルウェアは必要ありません (46). Zustand は、create 関数を使用してストアを作成し (38)、set 関数を使用して状態を更新し (40)、get 関数を使用して現在の状態にアクセスします (40).
使用方法
Redux では、状態を変更するにはアクションをディスパッチする必要があり (11)、リデューサーが状態を更新します (2). Redux は、アプリケーションの状態を変更する唯一の方法としてアクションを使用します (11). コンポーネントは、useSelector フックを使用して Redux ストアから状態を選択し、useDispatch フックを使用してアクションをディスパッチします (50).
Zustand では、状態を直接更新します (2). Zustand を使用すると、ストア内の状態を直接変更できます (46). コンポーネントは、create 関数によって返されるカスタムフックを使用してストアにアクセスし、状態と更新関数を直接利用します (5).
パフォーマンス
Zustand の軽量なアプローチは、特に再レンダリングを最小限に抑えることが重要な大規模アプリケーションで、多くの場合、パフォーマンスの向上につながります (2). Redux も大規模なアプリケーションを処理できますが、最高のパフォーマンスを得るには追加の最適化が必要になる場合があります (2). Zustand は、プロキシベースのシステムを使用して状態の変更を追跡し、必要な場合にのみコンポーネントを再レンダリングします (2). Zustand は、必要なコンポーネントのみを再レンダリングする効率的なリアクティビティシステムを備えています (2).
学習曲線
Zustand は、API がシンプルなため、Redux よりも簡単に使い始めることができます (2). Redux は、アクション、リデューサー、ミドルウェアなどを含むため、より複雑であり、初心者にとっては圧倒される可能性があります (2). Zustand は、Redux ほど学習に時間をかけずに習得できます (47). Zustand は、最小限のボイラープレートと直感的な API により、Redux よりも学習曲線が緩やかです (53).
エコシステム
Redux は、多数のライブラリ、チュートリアル、リソースを備えた、はるかに大きなコミュニティを持っています (2). Zustand のコミュニティは小さいですが、急速に成長しています (2). Redux のエコシステムには、デバッグと開発のための追加ツールが含まれています (50). これは、複雑な状態の変化のデバッグが重要な大規模アプリケーションでは特に価値があります (50). Redux Toolkit は、Redux の開発を効率化するための推奨ツールセットであり、ストアのセットアップ、リデューサーの定義、不変な更新ロジック、アクションクリエイターやアクションタイプの自動生成など、多くの一般的な Redux のユースケースを簡略化するユーティリティが含まれています (31).
主要な比較表
特徴 | Redux (with Redux Toolkit) | Zustand |
アーキテクチャ | 単一ストア、厳格な単方向データフロー | 複数ストア(柔軟)、より直接的なデータフロー |
API | 構造化、createSlice, configureStore, useSelector, useDispatch | シンプル、create, set, get, カスタムフック |
ボイラープレート | 比較的多い | 非常に少ない |
パフォーマンス | 最適化が必要な場合あり | 一般的に高い |
学習曲線 | 急 | 緩やか |
エコシステム | 大規模、成熟 | 成長中、比較的小規模 |
ユースケース | 大規模、複雑なアプリケーション、予測可能性と保守性を重視 | 小〜中規模、迅速なプロトタイピング、シンプルさ、パフォーマンス重視 |
5. ユースケースと推奨事項
Reduxが一般的に適しているユースケース
Redux は、大規模アプリケーションや複雑な状態管理が求められる場合に特に適しています (13). 多数の機能とコンポーネントを持つアプリケーション (29) や、複雑な依存関係を持つ状態を管理する必要がある場合 (61) に、Redux の構造化されたアプローチは有効です。長期的な保守性とスケーラビリティが重要な場合 (27) や、非同期処理、ロギング、認証など、高度な機能が必要な場合 (18) にも、Redux の成熟したエコシステムとミドルウェアのサポートが役立ちます (21). また、Redux DevTools の強力なデバッグ機能を活用したい場合 (65) や、状態の予測可能性を高め、アプリケーションの振る舞いを理解しやすくしたい場合 (4) にも、Redux は適しています。
Zustandが一般的に適しているユースケース
Zustand は、小規模から中規模のアプリケーション (39) や、迅速なプロトタイピングが求められる場合 (39) に特に適しています。比較的シンプルな状態管理で済むアプリケーション (5) や、最小限のセットアップで状態管理を開始したい場合 (39) にも、Zustand のシンプルさが役立ちます。グローバルな設定、UI の状態、簡単なデータ共有など、シンプルな状態管理 (43) で済む場合や、ボイラープレートを避け、簡潔なコードで状態管理を行いたい場合 (5) にも、Zustand は適しています。また、パフォーマンスを重視する場合 (28) や、より柔軟で記述量の少ないソリューションを好む場合 (1) にも、Zustand は良い選択肢となります。
6. コード例の比較
Redux Toolkit と Zustand を使用した基本的なカウンターの実装を比較することで、それぞれの基本的な実装方法を理解できます (46).
Redux Toolkit を使用した実装:
JavaScript
// store.js
import { configureStore, createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
export const { increment, decrement } = counterSlice.actions;
export const store = configureStore({
reducer: {
counter: counterSlice.reducer,
},
});
// App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './store';
function App() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
<div>
<h1>Counter: {count}</h1>
<button onClick={() => dispatch(increment())}>Increment</button>
<button onClick={() => dispatch(decrement())}>Decrement</button>
</div>
);
}
export default App;
Zustand を使用した実装:
JavaScript
// store.js
import { create } from 'zustand';
const useCounterStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
}));
export default useCounterStore;
// App.js
import React from 'react';
import useCounterStore from './store';
function App() {
const { count, increment, decrement } = useCounterStore();
return (
<div>
<h1>Counter: {count}</h1>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}
export default App;
これらの例を比較すると、Zustand の方がコードが簡潔であり、ファイル構成もシンプルであることがわかります (78). Redux Toolkit は、reducer と action を createSlice で一元的に定義し、ストアの作成に configureStore を使用するなど、より構造化されたアプローチを採用しています。Zustand は、カスタムフックを通じて状態と更新関数を直接利用するため、より宣言的で直感的な使用感を提供します (79).
7. 結論
ReduxとZustandの主な違いと類似点のまとめ
Redux と Zustand はどちらも React アプリケーションの状態管理に有効なライブラリですが、アーキテクチャ、API、および使用方法においていくつかの重要な違いがあります。Redux は単一のグローバルストアと厳格な単方向データフローを特徴とし、予測可能性と保守性に優れています。一方、Zustand は複数の独立したストアの作成が可能で、より柔軟なデータフローを提供し、シンプルさとパフォーマンスを重視しています。API において、Redux Toolkit は構造化された API を提供するのに対し、Zustand はよりシンプルで直接的な API を提供します。使用方法では、Redux はアクションのディスパッチとリデューサーによる状態更新というパターンに従いますが、Zustand はカスタムフックを通じて状態と更新関数を直接利用します。パフォーマンスに関しては、Zustand は軽量であり、必要なコンポーネントのみを再レンダリングするため、一般的に高いパフォーマンスを発揮します。学習曲線は、Redux が急であるのに対し、Zustand は緩やかです。エコシステムは、Redux が大規模で成熟しているのに対し、Zustand は成長中であり、比較的小規模です。両ライブラリは、リアクティブな状態管理を提供し、React アプリケーションの複雑な状態を効率的に管理するという共通の目的を持っています。
プロジェクトの要件とチームの好みに基づいた、最適なライブラリ選択のための最終的な推奨事項
最適な状態管理ライブラリの選択は、アプリケーションの規模、複雑さ、パフォーマンス要件、チームの経験など、多くの要因に依存します。大規模で複雑なアプリケーションや、長期的な保守性、予測可能性、エコシステムの成熟度を重視する場合は、Redux (Redux Toolkit を含む) が依然として強力な選択肢となります。一方、小〜中規模のアプリケーションや、迅速なプロトタイピング、シンプルさ、開発速度、パフォーマンス、記述量の少なさを重視する場合は、Zustand がより適している可能性があります。React Hooks に慣れているチームや、より柔軟で直感的な API を好む場合にも、Zustand は良い選択肢となるでしょう。状況によっては、アプリケーションの異なる部分で両方のライブラリを適切に使い分けることも可能です。最終的には、プロジェクトの具体的な要件とチームの好みを慎重に評価し、最適なライブラリを選択することが重要です。
引用文献
- Zustand Architecture Patterns at Scale – Brainhub, 4月 7, 2025にアクセス、 https://brainhub.eu/library/zustand-architecture-patterns-at-scale
- A Comprehensive Comparison – Redux vs Zustand in the React Ecosystem – Sand Console, 4月 7, 2025にアクセス、 https://sandconsole.com/blogs/a-comprehensive-comparison-redux-vs-zustand-in-the-react-ecosystem
- reduxjs/redux: A JS library for predictable global state management – GitHub, 4月 7, 2025にアクセス、 https://github.com/reduxjs/redux
- Redux – A JS library for predictable and maintainable global state …, 4月 7, 2025にアクセス、 https://redux.js.org/
- Why Everyone Loves Zustand | Verved, 4月 7, 2025にアクセス、 https://verved.ai/blog/why-everyone-loves-zustand
- Zustand: Simplifying State Management in React E-commerce Applications, 4月 7, 2025にアクセス、 https://www.pedroalonso.net/blog/react-state-management-zustand/
- Redux Core Concepts – Tutorialspoint, 4月 7, 2025にアクセス、 https://www.tutorialspoint.com/redux/redux_core_concepts.htm
- Redux Fundamentals, Part 4: Store | Redux, 4月 7, 2025にアクセス、 https://redux.js.org/tutorials/fundamentals/part-4-store
- Redux Store – Tutorialspoint, 4月 7, 2025にアクセス、 https://www.tutorialspoint.com/redux/redux_store.htm
- What Is Redux? – Koombea, 4月 7, 2025にアクセス、 https://www.koombea.com/blog/what-is-redux/
- Store | Redux, 4月 7, 2025にアクセス、 https://redux.js.org/api/store
- Redux FAQ: Reducers, 4月 7, 2025にアクセス、 https://redux.js.org/faq/reducers
- Redux Fundamentals, Part 3: State, Actions, and Reducers | Redux, 4月 7, 2025にアクセス、 https://redux.js.org/tutorials/fundamentals/part-3-state-actions-reducers
- Redux Actions: Understanding State Management – Tutorialspoint, 4月 7, 2025にアクセス、 https://www.tutorialspoint.com/redux/redux_actions.htm
- The Redux, Reducers, and .reduce() puzzle | by Jason Arnold | Medium, 4月 7, 2025にアクセス、 https://medium.com/@thejasonfile/the-redux-reducers-and-reduce-puzzle-ecc935191fbf
- What is a difference between action,reducer and store in redux? – Stack Overflow, 4月 7, 2025にアクセス、 https://stackoverflow.com/questions/54385323/what-is-a-difference-between-action-reducer-and-store-in-redux
- When to use Redux – Store – State – Actions – Reducers – YouTube, 4月 7, 2025にアクセス、 https://www.youtube.com/watch?v=ey0SYV-OBo4
- An Introduction to Middleware in Redux: Types, Benefits, and Examples – Medium, 4月 7, 2025にアクセス、 https://medium.com/@siavash.sajjady/an-introduction-to-middleware-in-redux-types-benefits-and-examples-985c876e706c
- Middleware | Redux, 4月 7, 2025にアクセス、 https://redux.js.org/understanding/history-and-design/middleware
- ReactJS / Redux Tutorial – #6 Redux Middleware – YouTube, 4月 7, 2025にアクセス、 https://www.youtube.com/watch?v=AgO7YcJeBh4
- Writing Custom Middleware | Redux, 4月 7, 2025にアクセス、 https://redux.js.org/usage/writing-custom-middleware
- Understanding Redux: Core Concepts and How It Works | by Mostafizur Rahman – Medium, 4月 7, 2025にアクセス、 https://mostafizur99.medium.com/understanding-redux-core-concepts-and-how-it-works-19ab0836b6e8
- Beginner’s Guide to Redux. A Predictable State Container for… | by Ayush Verma | JavaScript in Plain English, 4月 7, 2025にアクセス、 https://javascript.plainenglish.io/redux-javascript-library-da402be58bf3
- Why and When to Use Redux Design Pattern: State Management, Redux Store, Data Flows, 4月 7, 2025にアクセス、 https://www.oursky.com/blogs/why-and-when-to-use-redux-design-pattern-state-management-redux-store-data-flows
- Redux DevTools Overview – Tutorialspoint, 4月 7, 2025にアクセス、 https://www.tutorialspoint.com/redux/redux_devtools.htm
- www.codetru.com, 4月 7, 2025にアクセス、 https://www.codetru.com/blog/redux-in-react-functions-advantages/#:~:text=Centralized%20State%20Management,hard%2Dto%2Dtrack%20states.
- Redux in React: Functions And Advantages – Codetru, 4月 7, 2025にアクセス、 https://www.codetru.com/blog/redux-in-react-functions-advantages/
- Redux vs Zustand vs Context API: Their Pros, Cons, and Usage | by Israel – Medium, 4月 7, 2025にアクセス、 https://medium.com/design-bootcamp/redux-vs-zustand-vs-context-api-their-pros-cons-and-usage-d3bcbb79ab6a
- The Advantages of Using Redux along with React – SynergyTop, 4月 7, 2025にアクセス、 https://synergytop.com/blog/the-advantages-of-using-redux-along-with-react/
- React Redux – A Complete Guide With Examples & Use Cases …, 4月 7, 2025にアクセス、 https://www.memberstack.com/blog/react-redux
- Request for Discussion: Redux “boilerplate”, learning curve … – GitHub, 4月 7, 2025にアクセス、 https://github.com/reduxjs/redux/issues/2295
- Redux FAQ: General, 4月 7, 2025にアクセス、 https://redux.js.org/faq/general
- What are the disadvantages of using Redux with ReactJS? | by Noor …, 4月 7, 2025にアクセス、 https://nooriik.medium.com/what-are-the-disadvantages-of-using-redux-with-reactjs-7c5fa70bedaa
- Learning Redux Is Not That Bad – Medium, 4月 7, 2025にアクセス、 https://medium.com/@capitalkreationz/learning-redux-is-not-that-bad-8de840780dd6
- Understanding Redux: The World’s Easiest Guide to Beginning Redux | by Ohans Emmanuel | We’ve moved to freeCodeCamp.org/news | Medium, 4月 7, 2025にアクセス、 https://medium.com/free-code-camp/understanding-redux-the-worlds-easiest-guide-to-beginning-redux-c695f45546f6
- Context API vs Redux : Which State Management Solution is Right?, 4月 7, 2025にアクセス、 https://www.oneclickitsolution.com/blog/context-api-vs-redux
- is it good practice to store everything in redux if it’s already used in the project? – Reddit, 4月 7, 2025にアクセス、 https://www.reddit.com/r/reactjs/comments/1bo99kl/is_it_good_practice_to_store_everything_in_redux/
- Zustand: Introduction, 4月 7, 2025にアクセス、 https://zustand.docs.pmnd.rs/
- Zustand — State Management for React – Medium, 4月 7, 2025にアクセス、 https://medium.com/@onix_react/zustand-state-management-for-react-feef64b2555e
- create ⚛️ – Zustand, 4月 7, 2025にアクセス、 https://zustand.docs.pmnd.rs/apis/create
- createStore – Zustand, 4月 7, 2025にアクセス、 https://zustand.docs.pmnd.rs/apis/create-store
- Zustand – create vs createStore – Dan’s Blog, 4月 7, 2025にアクセス、 https://tuffstuff9.hashnode.dev/zustand-create-vs-createstore
- Zustand Key Features: State Management Simplified – CodeParrot, 4月 7, 2025にアクセス、 https://codeparrot.ai/blogs/zustand-key-features-state-management-simplified
- Slices Pattern – Zustand, 4月 7, 2025にアクセス、 https://zustand.docs.pmnd.rs/guides/slices-pattern
- A Slice-Based Zustand Store for Next.js 14 and TypeScript – Atlys Engineering, 4月 7, 2025にアクセス、 https://engineering.atlys.com/a-slice-based-zustand-store-for-next-js-14-and-typescript-6b92385a48f5
- Redux vs Zustand: A Quick Comparison / Blogs / Perficient, 4月 7, 2025にアクセス、 https://blogs.perficient.com/2024/12/18/redux-vs-zustand-a-quick-comparison/
- State Management in React: Comparing Redux Toolkit vs. Zustand – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/hamzakhan/state-management-in-react-comparing-redux-toolkit-vs-zustand-3no
- Simplifying State Management in React with Zustand – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/sheraz4194/simplifying-state-management-in-react-with-zustand-g4k
- Recoil vs. Zustand vs. Redux – Medium, 4月 7, 2025にアクセス、 https://medium.com/@rashmipatil24/recoil-vs-zustand-vs-redux-ddd4f4f20a92
- Zustand vs Redux: Making Sense of React State Management – Wisp CMS, 4月 7, 2025にアクセス、 https://www.wisp.blog/blog/zustand-vs-redux-making-sense-of-react-state-management
- Zustand or Redux, which one is the best choice? – Saeloun Blog, 4月 7, 2025にアクセス、 https://blog.saeloun.com/2023/09/13/react-zustand-vs-redux/
- The Battle of State Management: Redux vs Zustand – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/ingeniouswebster/the-battle-of-state-management-redux-vs-zustand-6k4
- Zustand State Management Library: React – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/shubhamtiwari909/zustand-state-management-library-react-20p2
- What do you use Redux for? : r/reactjs – Reddit, 4月 7, 2025にアクセス、 https://www.reddit.com/r/reactjs/comments/1878mo2/what_do_you_use_redux_for/
- Zustand Makes React Too Easy – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/sovannaro/zustand-makes-react-too-easy-1i6d
- vannizhang/react-redux-boilerplate: Start React+Redux project with TypeScript in an easier and faster way – GitHub, 4月 7, 2025にアクセス、 https://github.com/vannizhang/react-redux-boilerplate
- Zustand state management: A performance booster with some pitfalls | by Philipp Raab, 4月 7, 2025にアクセス、 https://philipp-raab.medium.com/zustand-state-management-a-performance-booster-with-some-pitfalls-071c4cbee17a
- Zustand State Management | vs Redux – iXora Solution, 4月 7, 2025にアクセス、 https://ixorasolution.com/blog/dive-into-zustand-for-effortless-state-management/
- Redux for large scale react apps – by Mayank Shekhar – Medium, 4月 7, 2025にアクセス、 https://medium.com/@iMayank.Shekhar/redux-for-large-scale-react-apps-dd0fe9850fd
- Manage the State of a Complex Application by Integrating Redux with React, 4月 7, 2025にアクセス、 https://learning.workfall.com/learning/blog/manage-the-state-of-a-complex-application-by-integrating-redux-with-react/
- Prophecy of Redux: State Management in Large React Apps – DEV Community, 4月 7, 2025にアクセス、 https://dev.to/kigazon/prophecy-of-redux-state-management-in-large-react-apps-49d5
- Manage the State of a Complex Application by Integrating Redux …, 4月 7, 2025にアクセス、 https://www.workfall.com/learning/blog/manage-the-state-of-a-complex-application-by-integrating-redux-with-react/
- I’m new to using global state management, is it ok to use context and redux? : r/reactjs, 4月 7, 2025にアクセス、 https://www.reddit.com/r/reactjs/comments/1eh1i8u/im_new_to_using_global_state_management_is_it_ok/
- agraboso/redux-api-middleware – GitHub, 4月 7, 2025にアクセス、 https://github.com/agraboso/redux-api-middleware
- How to use Redux DevTools – YouTube, 4月 7, 2025にアクセス、 https://www.youtube.com/watch?v=BYpuigD01Ew&pp=0gcJCdgAo7VqN5tD
- Redux debugging with Redux Dev Tools | React Redux Tutorial – #3 – YouTube, 4月 7, 2025にアクセス、 https://www.youtube.com/watch?v=LtpLNpr2SOE
- Exploring Zustand: A Minimalistic Approach to React State Management – DavitDvalashvili, 4月 7, 2025にアクセス、 https://davitdvalashvili1996.medium.com/exploring-zustand-a-minimalistic-approach-to-react-state-management-a3188d52c62e
- State Management in 2025: When to Use Context, Redux, Zustand, or Jotai, 4月 7, 2025にアクセス、 https://dev.to/hijazi313/state-management-in-2025-when-to-use-context-redux-zustand-or-jotai-2d2k
- Mastering State Management in React: Top 3 Tools – Redux, Zustand, and Context API, 4月 7, 2025にアクセス、 https://hyscaler.com/insights/effective-state-management-in-react/
- Mastering Zustand: A Simple and Efficient State Management …, 4月 7, 2025にアクセス、 https://www.bomberbot.com/react/mastering-zustand-a-simple-and-efficient-state-management-library-for-react/
- Why I Moved from React Redux to Zustand and Why You Should Too! – YouTube, 4月 7, 2025にアクセス、 https://www.youtube.com/watch?v=DK-S4ZcmDcE
- Managing Global State with Zustand: Simplicity and Performance | by Kaique Perez, 4月 7, 2025にアクセス、 https://medium.com/@kaiqueperezz/managing-global-state-with-zustand-simplicity-and-performance-ddb2785e558f
- Zustand Used For – PerfectionGeeks, 4月 7, 2025にアクセス、 https://www.perfectiongeeks.com/zustand
- Mastering State Management with Zustand in Next.js and React …, 4月 7, 2025にアクセス、 https://dev.to/mrsupercraft/mastering-state-management-with-zustand-in-nextjs-and-react-1g26
- Understanding Zustand: A Lightweight State Management Library for React – Saiful’s Blog, 4月 7, 2025にアクセス、 https://blog.msar.me/understanding-zustand-a-lightweight-state-management-library-for-react
- When to use Store (Zustand) vs Context vs Redux ? : r/react – Reddit, 4月 7, 2025にアクセス、 https://www.reddit.com/r/react/comments/1g6ci6n/when_to_use_store_zustand_vs_context_vs_redux/
- Comparison – Zustand, 4月 7, 2025にアクセス、 https://zustand.docs.pmnd.rs/getting-started/comparison
- Differentiating Zustand and Redux: A Comprehensive Comparison – Bright Coding, 4月 7, 2025にアクセス、 https://www.blog.brightcoding.dev/2023/08/24/differentiating-zustand-and-redux-a-comprehensive-comparison/
- Redux Vs Zustand : r/reactjs – Reddit, 4月 7, 2025にアクセス、 https://www.reddit.com/r/reactjs/comments/1iu49jq/redux_vs_zustand/