react-best-practices について
Vercelがメンテナンスする、ReactとNext.jsのパフォーマンス指針です。アプリの開発、レビュー、リファクタリングに取り組む開発者向けで、影響度順の70ルールを8カテゴリに整理し、個別ファイルに例と解説を収録しています。
主な機能
- 018カテゴリにわたる70のルール
- 02影響度に基づく優先順位
- 03データ取得とバンドルの指針
- 04サーバー、クライアント、描画の指針
- 05ルールごとの解説とコード例
活用シーン
- 01ReactやNext.jsの性能レビュー
- 02データ取得を見直してウォーターフォールを削減
- 03バンドルサイズと読み込み時間の改善
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ laguagu/ claude-code-nextjs-skills --skill react-best-practicesインストール後、Claude Code で/react-best-practicesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonREADME.mdrules/_sections.md_template.mdadvanced-effect-event-deps.mdadvanced-event-handler-refs.mdadvanced-init-once.mdadvanced-use-latest.mdasync-api-routes.mdasync-cheap-condition-before-await.mdasync-defer-await.mdasync-dependencies.mdasync-parallel.mdasync-suspense-boundaries.mdbundle-analyzable-paths.mdbundle-barrel-imports.mdbundle-conditional.mdbundle-defer-third-party.mdbundle-dynamic-imports.mdbundle-preload.mdclient-event-listeners.mdclient-localstorage-schema.mdclient-passive-event-listeners.mdclient-swr-dedup.mdjs-batch-dom-css.mdjs-cache-function-results.mdjs-cache-property-access.mdjs-cache-storage.mdjs-combine-iterations.md詳細
Vercel React のベストプラクティス
Vercel が管理する、React および Next.js アプリケーション向けの包括的なパフォーマンス最適化ガイドです。影響度の高い順に並べた 8 カテゴリ、70 のルールが掲載されており、自動リファクタリングやコード生成の指針として活用できます。
バージョンの互換性
| 機能 | 最小バージョン |
|---|---|
| コアとなるパフォーマンスルール(async、bundle、js) | React 18 + Next.js 14 |
React.cache()(server-cache-react) | React 19 |
<Activity>(rendering-activity) | React 19.2 |
useEffectEvent(advanced-effect-event-deps、advanced-use-latest、advanced-event-handler-refs) | React 19.2 |
after()(server-after-nonblocking) | Next.js 15.1 |
use()、非同期トランジション、リソースヒント(async-suspense-boundaries、rendering-usetransition-loading、rendering-resource-hints) | React 19 |
React Compiler(rerender-* ルールに影響) | React 17/18/19。古いバージョンでは、対応するターゲットとランタイムが必要です |
use cache ディレクティブ(cache-components スキルを参照) | Next.js 16 |
適用する場面
以下の場合は、これらのガイドラインを参照してください。
- 新しい React コンポーネントや Next.js ページを作成するとき
- データ取得(クライアント側またはサーバー側)を実装するとき
- パフォーマンス上の問題についてコードをレビューするとき
- 既存の React/Next.js コードをリファクタリングするとき
- バンドルサイズや読み込み時間を最適化するとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | ウォーターフォールの解消 | CRITICAL | async- |
| 2 | バンドルサイズの最適化 | CRITICAL | bundle- |
| 3 | サーバー側のパフォーマンス | HIGH | server- |
| 4 | クライアント側のデータ取得 | MEDIUM-HIGH | client- |
| 5 | 再レンダリングの最適化 | MEDIUM | rerender- |
| 6 | レンダリングのパフォーマンス | MEDIUM | rendering- |
| 7 | JavaScript のパフォーマンス | LOW-MEDIUM | js- |
| 8 | 高度なパターン | LOW | advanced- |
低レベルの JavaScript ルールを適用する前に、プロファイリングを行ってください。これらは計測によって特定したホットパスに適用する候補であり、読みやすいコードを書き換えるためのチェックリストではありません。React Compiler が有効な場合は、手動でメモ化を追加する前に、その適用範囲を確認してください。
クイックリファレンス
1. ウォーターフォールの解消(CRITICAL)
async-cheap-condition-before-await- フラグやリモート値を await する前に、低コストの同期条件を確認するasync-defer-await- 実際に使用する分岐の中に await を移動するasync-parallel- 独立した処理には Promise.all() を使用するasync-dependencies- 部分的な依存関係には better-all を使用するasync-api-routes- API ルートでは Promise を早めに開始し、await を遅らせるasync-suspense-boundaries- Suspense を使用してコンテンツをストリーミングする
2. バンドルサイズの最適化(CRITICAL)
bundle-barrel-imports- 直接インポートし、バレルファイルを避けるbundle-analyzable-paths- 広範なバンドルやトレースを避けるため、静的に解析可能なインポートパスとファイルシステムパスを優先するbundle-dynamic-imports- 重いコンポーネントには next/dynamic を使用するbundle-defer-third-party- ハイドレーション後に分析やログ記録を読み込むbundle-conditional- 機能が有効になったときだけモジュールを読み込むbundle-preload- 体感速度を高めるため、ホバーやフォーカス時にプリロードする
3. サーバー側のパフォーマンス(HIGH)
server-auth-actions- API ルートと同様に、サーバーアクションを認証するserver-cache-react- リクエストごとの重複排除に React.cache() を使用するserver-cache-lru- リクエストをまたぐキャッシュには LRU キャッシュを使用するserver-dedup-props- RSC props 内での重複したシリアライズを避けるserver-hoist-static-io- 静的 I/O(フォント、ロゴ)をモジュールレベルに移動するserver-no-shared-module-state- RSC/SSR で、モジュールレベルの可変なリクエスト状態を避けるserver-serialization- クライアントコンポーネントに渡すデータを最小限にするserver-parallel-fetching- フェッチを並列化できるようにコンポーネントを再構成するserver-parallel-nested-fetching- Promise.all 内でアイテムごとにネストされたフェッチを連鎖させるserver-after-nonblocking- ノンブロッキング処理には after() を使用する
4. クライアント側のデータ取得(MEDIUM-HIGH)
client-swr-dedup- SWR を使用してリクエストを自動的に重複排除するclient-event-listeners- グローバルイベントリスナーを重複排除するclient-passive-event-listeners- スクロールにはパッシブリスナーを使用するclient-localstorage-schema- localStorage のデータにバージョンを付け、最小限に抑える
5. 再レンダリングの最適化(MEDIUM)
rerender-defer-reads- コールバック内でのみ使用する状態を購読しないrerender-memo- 負荷の高い処理をメモ化したコンポーネントに切り出すrerender-memo-with-default-value- プリミティブでないデフォルトの props をコンポーネントの外に置くrerender-dependencies- エフェクトではプリミティブな依存値を使用するrerender-derived-state- 生の値ではなく、派生した真偽値を購読するrerender-derived-state-no-effect- エフェクトではなく、レンダー中に状態を導出するrerender-functional-setstate- 安定したコールバックには関数形式の setState を使用するrerender-lazy-state-init- 負荷の高い値には useState に関数を渡すrerender-simple-expression-in-memo- 単純なプリミティブ値にはメモ化を避けるrerender-split-combined-hooks- 依存関係が独立しているフックを分割するrerender-move-effect-to-event- インタラクションのロジックをイベントハンドラーに記述するrerender-transitions- 緊急性の低い更新には startTransition を使用するrerender-use-deferred-value- 入力の応答性を保つため、負荷の高いレンダーを遅延するrerender-use-ref-transient-values- 頻繁に変わる一時的な値には ref を使用するrerender-no-inline-components- コンポーネント内でコンポーネントを定義しない
6. レンダリングパフォーマンス(MEDIUM)
rendering-animate-svg-wrapper- SVG 要素ではなく、ラッパーの div をアニメーションさせるrendering-content-visibility- 長いリストには content-visibility を使用するrendering-hoist-jsx- 静的な JSX をコンポーネントの外に切り出すrendering-svg-precision- SVG 座標の精度を下げるrendering-hydration-no-flicker- クライアント側のみのデータにはインラインスクリプトを使用するrendering-hydration-suppress-warning- 想定される不一致の警告を抑制するrendering-activity- 表示/非表示には Activity コンポーネントを使用するrendering-conditional-render- 条件分岐には && ではなく三項演算子を使用するrendering-usetransition-loading- 読み込み状態には useTransition を優先するrendering-resource-hints- プリロードには React DOM のリソースヒントを使用するrendering-script-defer-async- script タグで defer または async を使用する
7. JavaScript のパフォーマンス(LOW-MEDIUM)
js-batch-dom-css- クラスまたは cssText で CSS の変更をまとめるjs-index-maps- 繰り返し検索する場合は Map を作成するjs-cache-property-access- ループ内ではオブジェクトのプロパティをキャッシュするjs-cache-function-results- モジュールレベルの Map に関数の結果をキャッシュするjs-cache-storage- localStorage/sessionStorage の読み取り結果をキャッシュするjs-combine-iterations- 複数の filter/map を 1 つのループにまとめるjs-length-check-first- 負荷の高い比較の前に配列の長さを確認するjs-early-exit- 関数から早期に return するjs-hoist-regexp- ループの外で RegExp を作成するjs-min-max-loop- 最小値/最大値の取得には sort ではなくループを使用するjs-set-map-lookups- O(1) の検索には Set/Map を使用するjs-tosorted-immutable- 不変性を保つために toSorted() を使用するjs-flatmap-filter- 1 回の処理でマッピングとフィルタリングを行うには flatMap を使用するjs-request-idle-callback- 重要度の低い処理をブラウザーのアイドル時間まで遅らせる
8. 高度なパターン(LOW)
advanced-effect-event-deps-useEffectEventの結果をエフェクトの依存配列に含めないadvanced-event-handler-refs- イベントハンドラーを ref に保存するadvanced-init-once- アプリの読み込みごとにアプリを一度だけ初期化するadvanced-use-latest- コールバックの ref を安定させるには useLatest を使用する
使用方法
詳しい説明とコード例については、各ルールのファイルを参照してください。
rules/async-parallel.md
rules/bundle-barrel-imports.md
各ルールのファイルには、以下が含まれています。
- 重要な理由についての簡潔な説明
- 誤ったコード例とその説明
- 正しいコード例とその説明
- 追加の背景情報と参考資料
コンパイル済みドキュメント全文
すべてのルールを詳しく説明した完全なガイド:AGENTS.md
コメント
Markdown 対応