AgentSkillsCN

react-best-practices

Vercel Engineering撰写的React与Next.js性能优化指南。当用户提出“优化React性能”“缩减打包体积”“修正重新渲染问题”“提升Next.js性能”“审查React代码”“重构组件”“优化数据获取”“消除瀑布式加载”“改善SSR性能”等需求时,或在进行React/Next.js组件、页面、数据获取、打包优化、渲染性能相关的代码编写、审查与重构时使用。

SKILL.md
--- frontmatter
name: react-best-practices
description:
  Vercel Engineeringが執筆したReactおよびNext.jsのパフォーマンス最適化ガイドライン。ユーザーが「Reactのパフォーマンスを最適化して」「バンドルサイズを削減して」「再レンダリングを修正して」「Next.jsのパフォーマンスを改善して」「Reactコードをレビューして」「コンポーネントをリファクタリングして」「データフェッチングを最適化して」「ウォーターフォールを排除して」「SSRパフォーマンスを改善して」と依頼した時、またはReact/Next.jsのコンポーネント、ページ、データフェッチング、バンドル最適化、レンダリングパフォーマンスに関わるコードの作成・レビュー・リファクタリングを行う時に使用する。

Vercel React ベストプラクティス

Vercel Engineeringが執筆した、ReactおよびNext.jsアプリケーション向けの包括的なパフォーマンス最適化ガイド。8つのカテゴリにわたる57のルールを、リファクタリングやコード生成を導くための優先度順に整理しています。

適用タイミング

以下の場面でこのガイドラインを適用してください:

  • 新しいReactコンポーネントまたはNext.jsページを作成する時
  • データフェッチング(クライアントまたはサーバーサイド)を実装する時
  • React/Next.jsコードをパフォーマンスの観点からレビュー・リファクタリングする時
  • バンドルサイズ、ロード時間、レンダリングを最適化する時
  • 再レンダリングの問題やウォーターフォールリクエストをデバッグする時

ルールカテゴリ

ルールはドメインごとにグループ化されています。各ルールにはオリジナルのソースによる影響レベルが設定されています。常にCRITICALとHIGHの影響レベルのルールを優先してください。

クイックリファレンス

1. ウォーターフォールの排除

ルール影響説明
async-defer-awaitHIGH実際に使用するブランチにawaitを移動する
async-parallelCRITICAL独立した処理にはPromise.all()を使用する
async-dependenciesCRITICAL部分的な依存関係にはbetter-allを使用する
async-api-routesCRITICALAPIルートではPromiseを早めに開始し、awaitを遅らせる
async-suspense-boundariesHIGHSuspenseを使用してコンテンツをストリーミングする

2. バンドルサイズの最適化

ルール影響説明
bundle-barrel-importsCRITICAL直接インポートを使用し、バレルファイルを避ける
bundle-dynamic-importsCRITICAL重いコンポーネントにはnext/dynamicを使用する
bundle-defer-third-partyMEDIUMハイドレーション後にアナリティクス/ログを読み込む
bundle-conditionalHIGH機能が有効化された時のみモジュールを読み込む
bundle-preloadMEDIUMホバー/フォーカス時にプリロードして体感速度を向上する

3. サーバーサイドのパフォーマンス

ルール影響説明
server-auth-actionsCRITICALサーバーアクションをAPIルートと同様に認証する
server-parallel-fetchingCRITICALフェッチを並列化するようにコンポーネントを再構成する
server-cache-lruHIGHクロスリクエストキャッシュにLRUキャッシュを使用する
server-serializationHIGHクライアントコンポーネントへ渡すデータを最小化する
server-cache-reactMEDIUMリクエストごとの重複排除にReact.cache()を使用する
server-after-nonblockingMEDIUMノンブロッキング処理にafter()を使用する
server-dedup-propsLOWRSCのpropsで重複シリアライズを避ける

4. クライアントサイドのデータフェッチング

ルール影響説明
client-swr-dedupMEDIUM-HIGH自動的なリクエスト重複排除のためにSWRを使用する
client-passive-event-listenersMEDIUMスクロールにはパッシブリスナーを使用する
client-localstorage-schemaMEDIUMlocalStorageのデータにバージョンを付けて最小化する
client-event-listenersLOWグローバルイベントリスナーを重複排除する

5. 再レンダリングの最適化

ルール影響説明
rerender-defer-readsMEDIUMコールバックのみで使用するstateの購読を避ける
rerender-memoMEDIUM高コストな処理をメモ化コンポーネントに抽出する
rerender-memo-with-default-valueMEDIUMデフォルトの非プリミティブpropsをホイストする
rerender-derived-stateMEDIUM生の値ではなく派生ブーリアンを購読する
rerender-derived-state-no-effectMEDIUMエフェクトではなくレンダリング中に状態を派生させる
rerender-functional-setstateMEDIUM安定したコールバックには関数型setStateを使用する
rerender-lazy-state-initMEDIUM高コストな値にはuseStateに関数を渡す
rerender-move-effect-to-eventMEDIUMインタラクションロジックはイベントハンドラに置く
rerender-transitionsMEDIUM緊急でない更新にはstartTransitionを使用する
rerender-use-ref-transient-valuesMEDIUM一時的な頻繁に変化する値にはrefを使用する
rerender-simple-expression-in-memoLOW-MEDIUM単純なプリミティブにmemoを使用しない
rerender-dependenciesLOWエフェクトにはプリミティブな依存関係を使用する

6. レンダリングパフォーマンス

ルール影響説明
rendering-content-visibilityHIGH長いリストにはcontent-visibilityを使用する
rendering-activityMEDIUM表示/非表示にはActivityコンポーネントを使用する
rendering-hydration-no-flickerMEDIUMクライアント専用データにはインラインスクリプトを使用する
rendering-hydration-suppress-warningLOW-MEDIUM想定されるミスマッチを抑制する
rendering-animate-svg-wrapperLOWSVG要素ではなくdivラッパーをアニメーション化する
rendering-hoist-jsxLOW静的なJSXをコンポーネント外に抽出する
rendering-svg-precisionLOWSVG座標の精度を下げる
rendering-conditional-renderLOW条件がfalsyな非ブーリアンになり得る場合は三項演算子を使用する
rendering-usetransition-loadingLOWローディング状態にはuseTransitionを優先する

7. JavaScriptパフォーマンス

ルール影響説明
js-length-check-firstMEDIUM-HIGH高コストな比較の前に配列の長さを確認する
js-tosorted-immutableMEDIUM-HIGHReactの状態でのミューテーションバグを防ぐためにtoSorted()を使用する
js-batch-dom-cssMEDIUMスタイルの書き込みをバッチ処理してレイアウトスラッシングを避ける
js-cache-function-resultsMEDIUM関数の結果をモジュールレベルのMapにキャッシュする
js-index-mapsLOW-MEDIUM繰り返し検索にはMapを構築する
js-cache-property-accessLOW-MEDIUMループ内でオブジェクトのプロパティをキャッシュする
js-cache-storageLOW-MEDIUMlocalStorageとsessionStorageの読み取りをキャッシュする
js-combine-iterationsLOW-MEDIUM複数のfilter/mapを1つのループにまとめる
js-early-exitLOW-MEDIUM関数から早期リターンする
js-hoist-regexpLOW-MEDIUMRegExpの生成をループ外にホイストする
js-set-map-lookupsLOW-MEDIUMO(1)検索にはSetとMapを使用する
js-min-max-loopLOWソートの代わりにループでmin/maxを求める

8. 高度なパターン

ルール影響説明
advanced-init-onceLOW-MEDIUMアプリの起動時に1回だけ初期化する
advanced-event-handler-refsLOWイベントハンドラをrefsに格納する
advanced-use-latestLOW安定したコールバックrefにはuseEffectEventを使用する

使い方

references/内の個別のルールファイルを読んで詳細な説明とコード例を確認してください。各ルールファイルには以下が含まれています:

  • そのパターンが重要な理由の簡単な説明
  • 問題のあるコード例と説明
  • 正しいコード例と説明
  • 追加のコンテキストとトレードオフ

特定のルールを参照するには:

code
references/<prefix>-<rule-name>.md

例:references/async-parallel.mdreferences/bundle-barrel-imports.md

コードをレビューする際は、CRITICALルール(async-、bundle-)から始めて優先度リストを下に進んでください。

使用例

複数のルールを実際のコンテキストで組み合わせた完全なbefore/afterシナリオ:

  • examples/nextjs-dashboard-page.md - ダッシュボードページ:ウォーターフォール排除 + 並列フェッチング + バンドル最適化 + SSR
  • examples/rerender-optimization-form.md - フォームコンポーネント:派生状態 + 関数型setState + 遅延初期化 + イベントハンドラ
  • examples/bundle-optimization-landing.md - ランディングページ:動的インポート + サードパーティの遅延読み込み + 条件付き読み込み + プリロード