nextjs-tanstack-form について
nextjs-tanstack-formは、Next.js 16でTanStack Formを使うためのガイドで、複雑で型安全なフォームを構築する開発者向けです。Server Actions、共有設定、クライアント・サーバー検証、動的フィールドや複数ステップのフォームを扱います。
主な機能
- 01formOptionsをクライアントとサーバーで共有
- 02ZodとServer Actionsによる検証
- 03mergeFormによるサーバーエラーの統合
- 04動的フィールド配列と複数ステップフォーム
- 05非同期検証とshadcn/uiのフィールド構成
活用シーン
- 01Next.js 16でServer Actions対応フォームを構築
- 02即時のクライアント検証とサーバー側DB検証を併用
- 03動的フィールドフォームや複数ステップのウィザードを作成
- 04デバウンス付き非同期検証と再利用可能なフィールドを導入
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fusengine/ agents --skill nextjs-tanstack-formインストール後、Claude Code で/nextjs-tanstack-formを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/array-fields.mdasync-validation.mdbasic-usage.mdclient-form.mdfield-api.mdform-state.mdinstallation.mdmigration-rhf.mdmulti-step-form.mdperformance.mdserver-actions.mdserver-validation.mdshadcn-integration.mdtesting.mdtypescript.mdvalidation-zod.md詳細
Field API(状態とハンドラー)、バリデーションのタイミング(onChange/onBlur/onSubmit/onServer)、動的なフィールド配列とマルチステップウィザード、デバウンス付き非同期バリデーション、shadcn/ui のフィールド構成についても説明します。また、フォームの SOLID に基づくファイル構成(form-options.ts、FormComponent.tsx、form.action.ts)と、React Hook Form との比較も記載しています。これは Next.js Server Actions 版の TanStack Form です。Next.js を使わない通常の React アプリについては、react-forms スキルを参照してください。
Next.js 16 向け TanStack Form
Server Actions とシグナルベースのリアクティビティを備えた、型安全で高パフォーマンスなフォームです。
エージェントのワークフロー(必須)
実装の前に、必ず 3 つのエージェントを並列で起動してください。それぞれ name を指定した Agent 呼び出しを 1 回ずつ行います。
- fuse-ai-pilot:explore-codebase - 既存のフォームとバリデーションのパターンを分析します
- fuse-ai-pilot:research-expert - Context7/Exa で TanStack Form の最新ドキュメントを確認します
- mcp__context7__query-docs - フォームオプションと Field API を確認します
実装後、検証のために fuse-ai-pilot:sniper を実行します。
概要
使用する場面
- 複雑なバリデーション要件を持つフォームを構築する場合
- フォーム送信に Server Actions との統合が必要な場合
- マルチステップウィザードや動的なフィールド配列を実装する場合
- リアルタイムの非同期バリデーション(ユーザー名の使用可否など)が必要な場合
- TypeScript の完全な型推論を備えた型安全なフォームが必要な場合
TanStack Form を選ぶ理由
| 特徴 | メリット |
|---|---|
| シグナルベースの状態管理 | 再レンダリングを最小限に抑え、パフォーマンスを最適化 |
| TypeScript の完全サポート | DeepKeys、DeepValue の推論 |
| Server Actions にネイティブ対応 | Next.js 16 との統合を標準搭載 |
| Standard Schema(Zod、Valibot…) | スキーマ優先のバリデーションで、アダプター不要 |
| フレームワーク非依存 | React、Vue、Solid で同じ API を使用 |
| ヘッドレス | あらゆる UI ライブラリ(shadcn/ui)で動作 |
重要なルール
formOptionsを共有 - 一度定義し、クライアントとサーバーの両方で使用します- サーバー側のバリデーション - DB チェックはクライアントではなく
onServerValidateで行います - Zod スキーマ - クライアント側で即時フィードバックを提供します
useActionState- Server Actions 用の React 19 フックですmergeForm- サーバーのエラーをクライアントの状態と統合します- SOLID に基づくパス - フォームは
modules/[feature]/src/components/forms/に配置します
SOLID アーキテクチャ
モジュール構成
フォームは機能モジュールごとに整理します。
modules/auth/src/components/forms/- 認証フォーム(ログイン、サインアップ)modules/auth/src/interfaces/- フォームの型とスキーマmodules/auth/src/actions/- フォーム送信用の Server Actionsmodules/cores/lib/forms/- 共有フォームユーティリティ
ファイル構成
| ファイル | 用途 | 最大行数 |
|---|---|---|
form-options.ts | 共有 formOptions と Zod スキーマ | 50 |
FormComponent.tsx | フィールドを含むクライアント側フォーム UI | 80 |
form.action.ts | バリデーションを含む Server Action | 30 |
form.interface.ts | フォーム値の型 | 30 |
主な概念
フォームオプションのパターン
フォーム設定を一度だけ定義し、クライアントとサーバーで共有します。型安全性と一貫性を確保できます。
Field API
各フィールドには状態(値、エラー、操作済み、バリデーション中)とハンドラー(handleChange、handleBlur)があります。
バリデーションのレベル
- onChange - ユーザーの入力に応じてリアルタイムに実行
- onBlur - フィールドからフォーカスが外れたときに実行
- onSubmit - フォーム送信前に実行
- onServer - アクション内でサーバー側にて実行
エラー管理
エラーはフィールド単位とフォーム単位で管理されます。フィールドのエラーには field.state.meta.errors、フォームのエラーには form.state.errorMap を使用します。
リファレンスガイド
| 必要な情報 | リファレンス |
|---|---|
| 初期設定 | installation.md |
| 基本パターン | basic-usage.md、field-api.md |
| バリデーション | validation-zod.md、async-validation.md |
| Server Actions | server-actions.md |
| 動的フォーム | array-fields.md、multi-step-form.md |
| UI 統合 | shadcn-integration.md |
| TypeScript | typescript.md |
| 移行 | migration-rhf.md |
| クライアント側フォームコンポーネント | client-form.md — 'use client' フォームコンポーネントで useActionState と mergeForm を組み合わせる場合に読み込んでください |
| サーバー側バリデーション | server-validation.md — Server Action で createServerValidate と ServerValidateError を記述する場合に読み込んでください |
ベストプラクティス
- 最初にスキーマを定義する - Zod スキーマがバリデーションと型の両方を担います
- formOptions を共有する - クライアントとサーバーの信頼できる唯一の情報源にします
- 非同期バリデーションをデバウンスする - API 呼び出しには
asyncDebounceMsを使用します - form.Subscribe - 送信状態に応じた選択的な再レンダリングを行います
- フィールドを組み合わせる - shadcn/ui で再利用可能なフィールドコンポーネントを作成します
- サーバーエラーをマージする -
mergeFormを使用してサーバーのバリデーションエラーを表示します
React Hook Form との比較
| 項目 | TanStack Form | React Hook Form |
|---|---|---|
| 型安全性 | 100%(DeepKeys) | 手動で型を指定 |
| パフォーマンス | シグナル(最小限) | Refs(良好) |
| Server Actions | ネイティブサポート | 手動で統合 |
| バンドルサイズ | 約12KB | 約9KB |
| 学習曲線 | 中程度 | 低い |
| 用途 | 複雑なアプリ | 標準的なフォーム |