react-best-practices について
react-best-practices は React の開発とコードレビュー向けのルール集です。パフォーマンス、構造、テスト、型安全性に関する助言を 9 分野に優先度順で整理し、必要なルールや例を参照できます。
主な機能
- 01優先度順のルール一覧
- 02非同期処理のウォーターフォール削減
- 03バンドルとクライアント取得の最適化
- 04コンポーネント構造と再レンダーの指針
- 05テストと型安全性のカバー
活用シーン
- 01React コンポーネントの新規作成
- 02性能問題のレビューとリファクタリング
- 03クライアント側データ取得の改善
- 04テストと型安全性の実践確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mastra-ai/ mastra --skill react-best-practicesインストール後、Claude Code で/react-best-practicesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/react-best-practices-reference.mdreferences/rules/async-parallel.mdbundle-barrel-imports.mdbundle-defer-third-party.mdclient-request-dedupe.mdjs-length-check-first.mdjs-set-map-lookups.mdjs-tosorted-immutable.mdrendering-animate-svg-wrapper.mdrendering-content-visibility.mdrerender-lazy-state-init.mdrerender-no-setstate-in-render-or-effect.mdrerender-no-useeffect-state-reset.mdrerender-no-usememo-usecallback.mdrerender-transitions.mdrerender-useeffect-function-calls.mdstructure-complex-derived-logic.mdstructure-component-naming.mdstructure-composition-over-config.mdstructure-data-fetching-layout.mdstructure-derive-dont-duplicate.mdstructure-early-return-render-branches.mdstructure-narrow-apis.mdstructure-single-responsibility.mdtesting-bdd-no-mocks.mdtesting-no-classname-assertions.mdtypes-no-null.mdtypes-no-type-assertions.md詳細
React のベストプラクティス
概要
React のパフォーマンスと品質に関するルーティングおよび優先度のガイドです。9 つのカテゴリにわたる 27 のルールが含まれています。ルールファイルには、詳しい解説、例、コードレビューで注意すべき点、影響度の指標が記載されています。
適用するタイミング
次のような場合に、これらのガイドラインを参照してください。
- 新しい React コンポーネントを作成する
- データ取得を実装する
- パフォーマンスの問題がないかコードをレビューする
- 既存の React コードをリファクタリングする
- バンドルサイズや読み込み時間を最適化する
優先度順のガイドライン
ルールは影響度に基づいて優先順位が付けられています。
| 優先度 | カテゴリ | 影響度 |
|---|---|---|
| 1 | ウォーターフォールの解消 | CRITICAL |
| 2 | バンドルサイズの最適化 | CRITICAL |
| 3 | クライアントサイドのデータ取得 | MEDIUM-HIGH |
| 4 | 再レンダリングの最適化 | MEDIUM |
| 5 | レンダリングパフォーマンス | MEDIUM |
| 6 | JavaScript のパフォーマンス | LOW-MEDIUM |
| 7 | コンポーネント構造 | MEDIUM-HIGH(保守性) |
| 8 | テスト | MEDIUM-HIGH(正確性) |
| 9 | 型安全性 | HIGH |
クイックリファレンス
重要なパターン(最優先で適用)
ウォーターフォールを解消する:
- 独立した非同期処理には
Promise.all()を使用します(async-parallel)
バンドルサイズを削減する:
- バレルファイルからのインポートを避け、ソースから直接インポートします(
bundle-barrel-imports) - 重要度の低いサードパーティライブラリの読み込みを遅らせます(
bundle-defer-third-party)
中程度の影響を与えるパターン
クライアント側のデータ取得:
- Tanstack Query を使用してリクエストを自動的に重複排除します(
client-request-dedupe) - 依存するクエリパラメーターの値は値そのものか
undefinedにします。| nullや偽のフォールバック値は使いません。呼び出し元で型を絞り込んでフックを厳密に保つか、フックがオプションのパラメーターを受け取る必要がある場合はskipTokenでガードします(client-request-dedupe)
再レンダーの最適化:
- コストの高い値には遅延状態初期化を使用します(
rerender-lazy-state-init) - 緊急性の低い更新には
startTransitionを適用します(rerender-transitions) - UI ハンドラーはシンプルに保ち、エフェクトから呼び出されるロジックにのみ Effect Events を使用します(
rerender-useeffect-function-calls) useEffectで状態をリセットしません。判別子を親に持ち上げ、分岐を再マウントします(rerender-no-useeffect-state-reset)useMemoやuseCallbackは追加しません。メモ化の判断は、プロファイラーの根拠を持つ開発者に委ねます(rerender-no-usememo-usecallback)- レンダリング中や
useEffect内でsetStateを呼び出しません。レンダリング中に値を導出するか、中間コンポーネントに状態の所有権を移します(rerender-no-setstate-in-render-or-effect)
コンポーネントの構成:
- ファイルごとにドメインコンポーネントまたはフックを1つ配置し、それぞれの責務を1つにします。肥大化したコンポーネントは分割します(
structure-single-responsibility) - コンポーネント、フック、関数、ユーティリティの API は範囲を絞ります。大きすぎる props、引数、戻り値オブジェクトは、コンポーネントレベルで組み合わせる目的別の単位に分割します。同じ値を1つのオブジェクトにまとめても解決にはなりません(
structure-narrow-apis) - JSX を返すヘルパーには PascalCase のコンポーネント名を使用し、JSX 以外の値を扱うヘルパーには小文字の名前を使用します(
structure-component-naming) - 別の引数から計算できる値は受け取らず、props やパラメーターを導出します(
structure-derive-dont-duplicate) - 複雑な導出ロジックは、名前付きローカル変数と述語、または早期リターンを使う純粋なヘルパーに切り出します。過大な条件式、ネストされた三項演算子、選択ではなく計算を行う三項演算子(複数行の分岐、または条件で確認した内容を再アサートする
asキャスト)、フォールバックの連鎖、letによるレンダリング準備はコードのにおいです。これはレンダリング準備だけでなく、フックのオプション、リクエストビルダー、設定マップ、リデューサーにも当てはまります(structure-complex-derived-logic) - 早期の
ifガードでビューを選択しつつ、レイアウトのラッパーは1か所にまとめます。ボディコンポーネントを分岐させ、シェルを三項演算子で選択したり重複させたりしません(structure-early-return-render-branches) - 項目の集合が固定されている場合は、各項目に対して明示的な props を持ち、データとローディング状態を管理するコンポーネントを1つずつ作成します。設定オブジェクトの配列をコンポーネントの形にマッピングしません(
structure-composition-over-config) - ドメインコンポーネントがデータを取得する場合は、スロットを配置する純粋なレイアウトコンポーネントを通じてレンダリングし、スロットの内容をスケルトンと解決済みのサブドメインコンポーネントの間で分岐させます(
structure-data-fetching-layout)
テスト:
- 実際の
@mastra/client-jsと React Query のスタックを使い、ネットワークのみをモックする BDD テストにします。独自のフック、サービス、認証ゲーティング、SDK をvi.mockでモックしません(testing-bdd-no-mocks) - 見た目の動作を検証するためにクラス名をアサートすることは避けます。計算済みスタイル、ユーザーから見える動作、ブラウザーでの検証を優先し、クラス名だけを実装に合わせて確認するテストより、テストを作らないことを優先します(
testing-no-classname-assertions)
型安全性:
- 本番コードでもテストでも、
asによる型アサーションは一切使いません。実際の型ガード、クエリのジェネリクス(querySelector<T>、getByRole<T>)、型付きフィクスチャーファクトリー、またはモックのimplementsで型を絞り込みます。許可される形式はas constのみです。キャストを、typeof value === 'object'だけを確認するドメイン型述語に置き換えてはいけません。その場合はisRecordヘルパーと呼ぶか、使用するフィールドを検証します(types-no-type-assertions) - 値がない場合は
nullではなくundefinedとオプションの?を使用します。外部のnullは境界で変換し、呼び出し元が値の不在とフォールバックのレンダリングを担うよう、末端の props は厳密に保ちます(types-no-null)
レンダリングパターン
- SVG 要素を直接ではなく、SVG ラッパーをアニメーションさせます(
rendering-animate-svg-wrapper) - 長いリストには
content-visibility: autoを使用します(rendering-content-visibility)
JavaScript パターン
- 繰り返し検索には Set/Map を使用します(
js-set-map-lookups) - 不変性を保つため、
sort()ではなくtoSorted()を使用します(js-tosorted-immutable) - 配列を比較する際は、最初に長さを確認します(
js-length-check-first)
参考資料
ルールファイルは、詳細なガイダンスと例を示す標準の情報源です。
references/react-best-practices-reference.md- カテゴリー順とルールファイルのパスを含むルールカタログreferences/rules/- カテゴリー別に整理された、標準の個別ルールファイル
特定のパターンを実装またはレビューする際は、関連するルールファイルのみを読み込んでください。すべての例を読み込まずに、カタログを使って適切なルールを選びます。
特定のパターンを検索するには、rules ディレクトリで grep を実行します。
grep -l "Promise.all" references/rules/
grep -l "barrel" references/rules/
grep -l "Tanstack" references/rules/
references/rules/ のルールカテゴリー
async-*- ウォーターフォールの解消(1 ルール)bundle-*- バンドルサイズの最適化(2 ルール)client-*- クライアント側のデータ取得(1 ルール)rerender-*- 再レンダリングの最適化(6 ルール)rendering-*- DOM レンダリングのパフォーマンス(2 ルール)js-*- JavaScript のマイクロ最適化(3 ルール)types-*- 型安全性/asキャストなし、nullなしのルール(2 ルール)structure-*- コンポーネント/フック/関数/ユーティリティの構成(8 ルール)testing-*- BDD テスト+ネットワークのみをモックする方針+className 実装ミラーアサーションなし(2 ルール)
コメント
Markdown 対応