mcpField
N
nextjs-zustand

nextjs-zustand

github.com/fusengine開発3474 回インストール2 週間前に更新
リポジトリ

nextjs-zustand について

nextjs-zustandは、Next.js 16 App RouterでZustand v5によるクライアント状態管理を実装するスキルです。リクエストごとに分離するContextストア、ハイドレーション、ミドルウェア構成、TypeScriptでのファイル整理を扱います。

主な機能

  1. 01Zustand v5のカリー化構文を使用
  2. 02ContextでApp Routerのストアを分離
  3. 03devtools・persist・immerを合成
  4. 04永続状態の手動再ハイドレーション
  5. 05セレクターにuseShallowを適用
  6. 06機能別のストアとファイル構成

活用シーン

  1. 01Client Components間でUI状態を共有
  2. 02App Routerでリクエスト分離ストアを作成
  3. 03テーマやカートなどの状態を永続化
  4. 04SSRとクライアントの不整合を防止

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fusengine/agents --skill nextjs-zustand

インストール後、Claude Code で/nextjs-zustandを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
auto-selectors.md
hydration.md
installation.md
middleware.md
migration-v5.md
nextjs-integration.md
reset-state.md
slices.md
store-patterns.md
subscribe-api.md
testing.md
typescript.md

詳細

Next.js 16 App Router で Zustand v5 のクライアントサイド状態管理を実装します。v5 のカリー化構文(`create()((set) => ({...}))`)、`zustand/vanilla` の `createStore` と `useRef` で構築する Context ベースのストア(リクエスト間で状態が漏れるのを防ぐため、App Router では必須です。グローバルストアは決して使用しません)、およびミドルウェアの合成(TypeScript では順序が重要です)を扱います。

persist ミドルウェアでの skipHydration と、SSR の不一致を避けるための useEffect 内での手動再ハイドレーション、配列/オブジェクトのセレクター向けの useShallow、SOLID に基づくファイル構成(store.ts、store-provider.tsx、use-store.ts)を扱います。Zustand はクライアントコンポーネント専用であり、サーバーコンポーネントでは決して使用しないこと(代わりにそこでデータを直接取得します)、認証トークンの永続化には決して使用しないこと(httpOnly Cookie を使用します)を明記します。サーバー状態のキャッシュは対象外です(その場合は nextjs-tanstack-query を参照してください)。

Next.js 16 向け Zustand

React 18 以降の useSyncExternalStore を使った、最小限で拡張性の高い状態管理です。

エージェントのワークフロー(必須)

実装を始める前に、必ず 3 つのエージェントを並行して起動してください。それぞれ 1 回の Agent 呼び出しで、name を指定します。

  1. fuse-ai-pilot:explore-codebase - 既存のストアと状態管理のパターンを分析します
  2. fuse-ai-pilot:research-expert - Context7/Exa を使って最新の Zustand v5 ドキュメントを確認します
  3. mcp__context7__query-docs - ミドルウェアと TypeScript のパターンを確認します

実装後、検証のために fuse-ai-pilot:sniper を実行してください。


概要

使用する場面
  • Next.js App Router アプリケーションでクライアントサイドの状態を管理する場合
  • クライアントコンポーネント間だけでグローバル状態を共有する必要がある場合
  • 状態を localStorage/sessionStorage に永続化する場合
  • UI の状態(モーダル、サイドバー、テーマ、カート)を構築する場合
  • 複雑な状態管理で React Context を置き換える場合
Zustand v5 を選ぶ理由
機能メリット
最小限の APIシンプルな create() 関数で、ボイラープレートが不要です
React 18 ネイティブuseSyncExternalStore を使用し、シムは不要です
TypeScript を第一に設計カリー化パターンにより、完全な型推論が得られます
ミドルウェアのスタックdevtools、persist、immer を組み合わせられます
バンドルサイズgzip 圧縮後で約 2 KB と、最小クラスの状態管理ライブラリです
プロバイダー不要Context ラッパーなしで、ストアに直接アクセスできます

重要なルール

  1. クライアントコンポーネント専用 - Zustand をサーバーコンポーネントで使用しないでください
  2. App Router では Context パターンを使用 - グローバルストアを避けます(リクエストの分離)
  3. 配列/オブジェクトには useShallow を使用 - 不要な再レンダリングを防ぎます
  4. persist では skipHydration を使用 - SSR との互換性に必須です
  5. v5 のカリー化構文 - create<State>()((set) => ({...}))
  6. SOLID に基づくパス - ストアは modules/[feature]/src/stores/ に配置します

SOLID アーキテクチャ

モジュール構成

ストアは機能モジュールごとに整理します。

  • modules/cores/stores/ - 共有ストア(テーマ、UI)
  • modules/auth/src/stores/ - 認証状態
  • modules/cart/src/stores/ - カートの状態
  • modules/[feature]/src/interfaces/ - ストアの型
ファイル構成
ファイル用途最大行数
store.tscreate() によるストアの作成50
store.interface.tsTypeScript インターフェース30
store-provider.tsxContext プロバイダー(App Router)40
use-store.tsセレクターを備えたカスタムフック20

主な概念

ストアの作成(v5 構文)

TypeScript の型推論には二重括弧が必要です。カリー化パターンにより、完全な型安全性が確保されます。

Context ベースのストア

Next.js App Router では、リクエスト間でストアが共有されないよう、ストアを Context でラップします。初期化には useRef と zustand/vanilla の createStore を使用します。

ミドルウェアの合成

ミドルウェアを devtools → persist → immer の順にスタックします。順序は TypeScript の型に影響します。

ハイドレーションの処理

persist ミドルウェアで skipHydration: true を使用します。SSR の不一致を避けるため、useEffect 内で手動再ハイドレーションを行います。


リファレンスガイド

必要な項目リファレンス
初期設定installation.md
ストアのパターンstore-patterns.md
SSR/ハイドレーションhydration.md
ミドルウェアmiddleware.md
Next.js App Routernextjs-integration.md
TypeScripttypescript.md
スライスパターンslices.md
自動セレクターauto-selectors.md
状態のリセットreset-state.md
Subscribe APIsubscribe-api.md
テストtesting.md
v4 から v5 への移行migration-v5.md

ベストプラクティス

  1. セレクターパターン - パフォーマンスのため、常に useStore((s) => s.field) を使用します
  2. useShallow - 再レンダリングを防ぐため、配列/オブジェクトのセレクターをラップします
  3. ストアを分ける - ドメインごとに1つのストアを用意します(認証、カート、UI、テーマ)
  4. サーバーデータは別の場所で管理する - サーバー状態には TanStack Query を使用します
  5. 開発時のみ DevTools を使用する - process.env のチェックで DevTools をラップします
  6. persist の対象を限定する - 必要なフィールドのみを永続化し、トークンは決して永続化しません

禁止されているパターン

パターン理由代替案
App Router でのグローバルストアユーザー間でリクエストが共有されますコンテキストベースのストア
Server Components での ZustandRSC では React フックを使用できませんデータを直接取得する
認証トークンの永続化セキュリティ上の脆弱性httpOnly クッキー
オブジェクトに useShallow を使用しない過剰な再レンダリングuseShallow(selector)
v4 の構文TypeScript の型推論が壊れますv5 のカリー化 create<T>()()

コメント