react
React 19/19.2 のモダンなパターン(並行レンダリング、Server Components、actions、ref の prop 渡し、ドキュメントメタデータ、リソースヒント、hooks、メモ化)に対応し、コードベース全体の重複排除・再利用を含むリファクタリング分析も提供するスキルです。React 19 コンポーネントの実装、並行機能の活用、React 18 からの移行、再レンダリングの最適化、またはコードベースの監査・リファクタリングを行う際に使用してください。Next.js 固有の機能(App Router、next.config.js、キャッシュ等)は対象外で、クライアントサイドのフォームバリデーションには react-hook-form スキルを使用してください。
description の原文を見る
React 19/19.2 modern patterns for concurrent rendering, Server Components, actions, ref-as-prop, document metadata, resource hints, hooks, and memoization — plus a category-major review/refactor algorithm with codebase-level (remove/dedup/reuse) findings. This skill should be used when writing React 19 components, using concurrent features, migrating from React 18, optimizing re-renders, OR auditing/refactoring a React codebase (single file or whole repo). This skill does NOT cover Next.js-specific features like App Router, next.config.js, or Next.js caching (use nextjs-16-app-router skill). For client-side form validation with React Hook Form, use react-hook-form skill.
SKILL.md 本文
React 19 ベストプラクティス
AI エージェント向けの包括的な React 19/19.2 ベストプラクティスガイド。9 つのカテゴリーにわたる 49 のルールを含み、重大事項 (concurrent rendering、Server Components) から横断的なコードベース衛生 (dedup、dead code、boundary coherence) まで、影響度順にプライオリティ付けされています。React 19 の主要な変更を反映:ref を通常のプロップとして扱用 (forwardRef 廃止)、ネイティブドキュメントメタデータ、リソースプリロード API、useActionState、useOptimistic、use() フック、および <Context> をプロバイダーとして使用。
ルールファイルはパターン形状(API 名ではなく)を説明し、**「認識すべき形状」セクションで開始します。このセクションでは、同じ違反が現れる 2~4 つの構文的な装いを列挙しています。高価値ルール選定 (form actions、ref-as-prop、derived state、context、use() フック、useCallback/memo ペアリングなど、実際のコードベースで最も一般的な装いを持つもの) には、パターン検出を grep 対応ケース以上に教えるための、追加の具体的な「装いを変えた」**正誤例ペアが含まれています。
適用タイミング
- 新しい React コンポーネントの作成または既存コンポーネントのリファクタリング
- ディレクトリ、PR、またはリポジトリ全体の監査またはモダン化 (
の必須手順を参照)references/_review-algorithm.md - React 18 から React 19 への移行 (forwardRef → ref-as-prop、
<Context.Provider>→<Context>、useFormState→useActionState) - 再レンダリングパフォーマンスまたはバンドルサイズの最適化
- concurrent 機能の使用 (useTransition、useDeferredValue、Activity)
- Server Components またはサーバー/クライアント境界の設定
- Form actions、optimistic updates、またはデータフェッチングの実装
- 自動メモ化用の React Compiler 設定
- 一般的なアンチパターンまたは廃止された React 18 イディオムの React コード検視
- コードベースレベルの問題の発見: ファイル間の重複ロジック、near-duplicate コンポーネント、dead code、不要な
'use client'ファイル、プロップ形状のドリフト (カテゴリー9 参照)
コードベースの審査またはリファクタリング方法
ユーザーが React コード (単一ファイルまたは全リポジトリ) の審査、リファクタリング、モダン化、または監査を依頼した場合は、 に従ってください。即興しないでください。references/_review-algorithm.md
そのドキュメントからの 4 つの絶対要件:
-
2 つのモード — 全リポジトリ監査を決して拒否しないでください。 モード A (限定的、≤~20 ファイル) またはモード B (全ツリー: インベントリパス + ターゲットスイープ + カテゴリー9 全体) を選択します。アルゴリズムは、800 ファイルをコンテキストにダンプすることなく、「コードベースを監査してください」にどう対応するかを教えてくれます。
-
grep より判断を優先します。 各ルールは構文マーカーではなく、パターン形状を指定します。スイープする前に各ルールの認識すべき形状セクションを読んでください — grep は簡単な違反を見つけ、高価値の違反を見逃します (著者が
forwardRefを回避したため手動でドリルされたコールバック ref、useActionStateの機能を行うonSubmit、derived state の形をしたuseState+useEffect、fetch ダンスを隠すカスタムフック)。Grep はトリガーであり、決して判定ではありません。 -
ファイル単位ではなくカテゴリー単位で、強制機能を伴う。 スコープ内の全ファイルについて、プライオリティ順 (CRITICAL → … → CROSS-CUTTING) に一度に 1 カテゴリーをスイープします。アルゴリズムはスコープ宣言、カテゴリーごとの進捗行、および最終的なカバレッジテーブル (
category × file, cells ∈{clean, N findings, n/a}) を要求します。出力に不足しているカテゴリーは直ちに明白です。 -
コードベースレベルの発見はカテゴリー9 から生じます。 単一ファイルルールは「これら 2 つのコンポーネントは 1 つである必要があります」または「このフックは dead です」とは言えません。カテゴリー9 (Codebase Hygiene) は最後に完全なインベントリをスイープし、remove / dedup / reuse / consolidate 発見を生成します。
単一ファイルのアドホック質問 (「このフックは OK ですか?」) は、関連ルールに直接進むことができます。アルゴリズムはマルチファイルおよび全リポジトリケースに存在します。
ルールカテゴリー
| # | カテゴリー | 影響 | ルール | 主要トピック |
|---|---|---|---|---|
| 1 | Concurrent Rendering | CRITICAL | 6 | useTransition、useDeferredValue、Activity、batching、render purity |
| 2 | Server Components | CRITICAL | 6 | RSC 境界、データフェッチング、ストリーミング、シリアライズ可能なプロップ |
| 3 | Actions & Forms | HIGH | 5 | Form actions、declarative form state、useOptimistic、server validation |
| 4 | Data Fetching | HIGH | 7 | use() フック、cache()、Suspense、document metadata、resource hints |
| 5 | State Management | MEDIUM-HIGH | 5 | Derived values、context split、functional updates、reducer |
| 6 | Memoization & Performance | MEDIUM | 5 | React Compiler、useMemo、useCallback、React.memo |
| 7 | Effects & Events | MEDIUM | 5 | useEffectEvent、cleanup、external stores、derived-state アンチパターン |
| 8 | Component Patterns | LOW-MEDIUM | 5 | ref-as-prop、composition、controlled vs uncontrolled、key reset |
| 9 | Codebase Hygiene | CROSS-CUTTING | 5 | Dedup、consolidation、dead code、boundary coherence、prop-shape drift |
クイックリファレンス
重大なパターン — これらを最初に正しく:
- Server Components でデータをフェッチし、Client Components ではしない
'use client'境界を可能な限り低く推し下げる- 高コストなノンブロッキング更新に
startTransitionを使用する - タブ/ページ切り替え間でステートを保持するために
<Activity>を使用する
React 19 モダンイディオム (React 18 パターンを生成しないでください):
function C({ ref, ...props })—forwardRefでラップしない<MyContext value={v}>—<MyContext.Provider>を使用しないuseActionState—useFormStateを使用しないuseRef<T>(null)— 常に初期値を渡す<title>、<meta>、<link>をインラインでレンダーする —react-helmetに手を出さないreact-domからpreload/preconnectを使用する —<link rel="preload">を手動でレンダーしない
一般的な単一ファイルの間違い — これらのアンチパターンを回避:
- Client Components 内で
use()用のプロミスを作成する (無限ループを引き起こす) - すべてをメモ化する (代わりに React Compiler v1.0+ を使用)
- derived state、mutations、親への通知、またはアプリ init に effects を使用する
'use client'をコンポーネントツリーの高すぎる位置に配置する
コードベースレベルのパターン — カテゴリー9 スイープでこれらを表面化:
- 0 個のインポーターを持つコンポーネント/フック/ユーティリティ — 削除
- 同じ effect/state 形状を持つ 2+ ファイル — 共有フックを抽出
- ドリフトがあるラベル/アイコンで構造的に同一の 2+ コンポーネント — バリアントまたは composition で統合
- クライアント実行を必要としないフック使用法を持つ
'use client'ファイル — Server Components に降格 (またはサーバー親 + クライアントアイランドに分割) - コンポーネント間で異なる名前で伝達される同じ概念的プロップ — 標準的な名前に収束
目次
Concurrent Rendering— CRITICAL- 1.1
ナビゲーション間でアンマウントする代わりに隠れたサブツリーステートを保持する— HIGH (<Activity>) - 1.2
遷移内の更新をラップしてナビゲーション間で以前のコンテンツを表示する— HIGH - 1.3
自動バッチングを信頼 — flushSync または unstable_batchedUpdates に手を出さない— HIGH - 1.4
高コストな子再レンダリングをドライブする値がない場合は、その値を遅延させる— CRITICAL (useDeferredValue) - 1.5
高コストなステート更新をロープライオリティとしてマークし、入力の応答性を保つ— CRITICAL (useTransition) - 1.6
レンダーを純粋に保つ — render 中に変更、subscribe、または外部ステートを読まない— MEDIUM-HIGH
- 1.1
Server Components— CRITICAL- 2.1
ブラウザ API に依存するライブラリを Client Component ラッパーの中に隔離— MEDIUM-HIGH - 2.2
遅い async 作業を独自の Suspense 境界の背後に分割し、高速コンテンツを最初にストリーミング— MEDIUM-HIGH - 2.3
サーバーで async/await を使用してデータを取得 — Client Component で— CRITICALuseEffect+fetchを決して使用しない - 2.4
— CRITICAL'use client'境界をルートではなく、インタラクティブなリーフまで押し下げる - 2.5
RSC ワイヤー形式がエンコードできるデータだけが server→client 境界を越える— HIGH - 2.6
サーバーコンテンツはインポートされることによってではなく、— HIGHchildrenまたは named slots を通じて Client Component の中に到達
- 2.1
Actions & Forms— HIGH- 3.1
フォーム送信を JS のみの— HIGHonSubmitハンドラーではなくactionプロップを通じて配線 - 3.2
命令型の pending/error/submit ブックキーピングを単一の declarative form-state フックに持ち上げる— HIGH (useActionState) - 3.3
送信ボタンは prop ドリル内ではなく context から親フォーム pending ステートを読む— MEDIUM-HIGH (useFormStatus) - 3.4
ポストミューテーション結果を自動的に即座に表示し、失敗時にロールバック— HIGH (useOptimistic) - 3.5
検証をサーバーアクション上の関心として扱う、クライアントチェックは拡張であり決して唯一のゲートではない— MEDIUM
- 3.1
Data Fetching— HIGH- 4.1
独立したフェッチは並行実行 — 順序付き— MEDIUM-HIGHawaitはウォーターフル - 4.2
リクエストごとにデータフェッチャーをメモ化し、同じデータを読む複数のコンポーネントが再フェッチしない— HIGH (cache()) - 4.3
各 Suspense 境界は Error Boundary でラップが必要 — 失敗は含まれている必要がある— MEDIUM - 4.4
ローディング状態は— HIGHif (loading) return …から組み立てられるのではなく、Suspense フォールバックとして宣言される - 4.5
— HIGH (useEffect+useState配管ではなくuse()でプロミスと条件付き context を読むuse()) - 4.6
ページメタデータが— MEDIUM<title>/<meta>/<link>インラインとしてレンダー — helmet スタイルのヘッドマネージャーを drop - 4.7
手動でレンダーされた— MEDIUM<link rel="preload">ではなくreact-domからの命令型リソースヒント API に到達
- 4.1
State Management— MEDIUM-HIGH- 5.1
派生値を render 本体で計算 — 決して separate state にミラーリングしない— MEDIUM - 5.2
各 context は 1 つの独立して変更されるステートを保持 — fat context を分割— MEDIUM - 5.3
次のステートが前のものに依存する場合、— MEDIUM-HIGHsetX(prev => …)を渡す —setX(x + 1)ではなく - 5.4
初期値が高コストの場合、— MEDIUM-HIGHuseStateに関数を渡す — インラインで計算しない - 5.5
調整されたマルチフィールドステート遷移は N 個の兄弟— MEDIUM (useStateセルではなく単一 reducer に存在useReducer)
- 5.1
Memoization & Performance— MEDIUM- 6.1
測定ベースラインからメモ化 — すべての値とコールバックを useMemo/useCallback で事前ラップしない— MEDIUM - 6.2
React Compiler v1.0 を採用 — ビルドにメモ化させ、手動の— MEDIUMuseMemo/useCallbackノイズを削除 - 6.3
高コストな純粋コンポーネントを— MEDIUMmemo()でラップ、プロップが実際に安定している場合のみ - 6.4
何か下流がアイデンティティ安定性に依存する場合のみ、コールバックのアイデンティティを安定化— MEDIUM (useCallback) - 6.5
入力が安定しており作業が測定可能に高コストである場合のみ、renders 間の計算をキャッシュ— MEDIUM (useMemo)
- 6.1
Effects & Events— MEDIUM- 7.1
subscribe、schedule、または connect する effect は、それを破棄するクリーンアップを返す必要がある— MEDIUM - 7.2
— HIGHuseEffectは外部システムとの同期用 — derived state、mutations、event logic、親への通知、またはアプリ init には決して使用しない - 7.3
Effect deps は reference-compared — in-render-constructed objects または arrays ではなく、primitives を渡す— MEDIUM - 7.4
effect のコールバック内で最新プロップ/ステートを読む — これらの値が変わる場合、re-subscribe しない— MEDIUM (useEffectEvent) - 7.5
— MEDIUMuseEffect+useStateではなくuseSyncExternalStoreを通じて外部 mutable ステートに subscribe
- 7.1
Component Patterns— LOW-MEDIUM- 8.1
コンポーネントは— MEDIUM-HIGHrefを通常の分割代入プロップとして受け取る —forwardRefラッパーを drop、ドリルを drop - 8.2
何かがすべての変更で値を読む場合のみ controlled state に到達 — そうでない場合は— LOW-MEDIUM<form action>でアンコントロール済みを推奨 - 8.3
プロップ数が ~6 を超えて多くのオプションスロットがある場合、— LOW-MEDIUMchildrenを取得し、呼び出し元に composition させる - 8.4
stateful child のアイデンティティを編集する entity にタイ、— LOW-MEDIUMkey={entity.id}を設定 — stale ステートを React が破棄させる - 8.5
親がレンダリングを制御する必要がある場合のみ render prop を使用 — ロジック再利用の場合、カスタムフックを推奨— LOW-MEDIUM
- 8.1
Codebase Hygiene— CROSS-CUTTING (マルチファイル発見、全リポジトリ監査に必須)- 9.1
重複した effect/state 形状を shared hook に抽出— HIGH - 9.2
near-duplicate コンポーネントをバリアントまたは composition でそれぞれ 1 つに統合— HIGH - 9.3
0 個のインポーターを持つコンポーネント、フック、ユーティリティを削除— MEDIUM-HIGH - 9.4
フック使用法がクライアントを必要としない— HIGH'use client'ファイルを降格 - 9.5
同じ概念がコンポーネント間で異なるプロップ名を持つ場合、標準的な名前に収束— MEDIUM-HIGH
- 9.1
リファレンス
- https://react.dev
- https://react.dev/blog/2024/04/25/react-19-upgrade-guide
- https://react.dev/blog/2024/12/05/react-19
- https://react.dev/blog/2025/10/01/react-19-2
- https://react.dev/blog/2025/10/07/react-compiler-1
- https://react.dev/learn/you-might-not-need-an-effect
- https://github.com/facebook/react
関連スキル
- Next.js 16 App Router に関しては、
nextjs-16-app-routerスキルを参照してください - クライアント側フォーム処理に関しては、
react-hook-formスキルを参照してください - TanStack Query でのデータキャッシングに関しては、
tanstack-queryスキルを参照してください
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- pproenca
- リポジトリ
- pproenca/dot-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/pproenca/dot-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。