react-best-practices について
Vite を使ったクライアントサイド React アプリの開発、レビュー、最適化向けのガイドです。影響度順に並んだ 8 分野、47 件のルールを収録し、Next.js と SSR は対象外です。
主な機能
- 01優先度付きの性能ルール 47 件
- 028 分野のガイド
- 03クライアント側データ取得パターン
- 04レンダリングと再レンダリングの助言
- 05useEffect の使い方
活用シーン
- 01React コンポーネントの性能レビュー
- 02バンドルサイズと描画の最適化
- 03useEffect のパターン選択
- 04クライアントサイド React コードのリファクタリング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ poteto/ noodle --skill react-best-practicesインストール後、Claude Code で/react-best-practicesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/_sections.mdadvanced-event-handler-refs.mdadvanced-init-once.mdadvanced-use-latest.mdasync-api-routes.mdasync-defer-await.mdasync-dependencies.mdasync-parallel.mdbundle-barrel-imports.mdbundle-conditional.mdbundle-defer-third-party.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.mdjs-early-exit.mdjs-hoist-regexp.mdjs-index-maps.mdjs-length-check-first.mdjs-min-max-loop.mdjs-set-map-lookups.mdjs-tosorted-immutable.mdrendering-animate-svg-wrapper.mdrendering-conditional-render.md詳細
React のベストプラクティス
クライアントサイドの React アプリケーション向けパフォーマンス最適化ガイドです。影響度の高い順に、8 つのカテゴリにわたる 47 のルールを収録しています。Vercel Engineering のガイドラインをもとに、クライアントサイドのみの React + Vite 向けに調整しています(Next.js/SSR は対象外です)。
適用するタイミング
次の場合に、これらのガイドラインを参照してください。
- 新しい React コンポーネントやフックを作成するとき
- パフォーマンスの問題がないかコードをレビューするとき
- 既存の React コードをリファクタリングするとき
- バンドルサイズやレンダリングパフォーマンスを最適化するとき
useEffectの使用箇所を作成またはレビューするとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | ウォーターフォールの排除 | CRITICAL | async- |
| 2 | バンドルサイズの最適化 | CRITICAL | bundle- |
| 3 | クライアントサイドのデータ取得 | MEDIUM-HIGH | client- |
| 4 | 再レンダリングの最適化 | MEDIUM | rerender- |
| 5 | useEffect のパターン | MEDIUM | useeffect- |
| 6 | レンダリングパフォーマンス | MEDIUM | rendering- |
| 7 | JavaScript のパフォーマンス | LOW-MEDIUM | js- |
| 8 | 高度なパターン | LOW | advanced- |
クイックリファレンス
1. ウォーターフォールの排除(CRITICAL)
async-defer-await— await は実際に必要な分岐の中に移動するasync-parallel— 独立した処理には Promise.all() を使うasync-dependencies— 一部の処理に依存関係がある場合は、プロミスチェーンを使うasync-api-routes— プロミスを早めに開始し、await は遅らせる
2. バンドルサイズの最適化(CRITICAL)
bundle-barrel-imports— 直接インポートし、バレルファイルは避けるbundle-conditional— 機能が有効になったときだけモジュールを読み込むbundle-defer-third-party— マウント後に分析/ロギングを読み込むbundle-preload— 体感速度を高めるため、ホバー/フォーカス時にプリロードする
3. クライアントサイドのデータ取得(MEDIUM-HIGH)
client-event-listeners— グローバルイベントリスナーを重複させないclient-passive-event-listeners— スクロール/タッチにはパッシブリスナーを使うclient-swr-dedup— SWR を使ってリクエストを自動的に重複排除するclient-localstorage-schema— localStorage のデータにバージョンを付け、最小限に保つ
4. 再レンダリングの最適化(MEDIUM)
rerender-derived-state-no-effect— effect ではなく、レンダリング中に state を導出するrerender-defer-reads— コールバックでしか使わない state を購読しないrerender-simple-expression-in-memo— 単純なプリミティブ値には memo を使わないrerender-memo-with-default-value— デフォルトの非プリミティブ props はコンポーネントの外に定義するrerender-memo— コストの高い処理をメモ化したコンポーネントに切り出すrerender-dependencies— effect の依存関係にはプリミティブ値を使うrerender-move-effect-to-event— インタラクションのロジックはイベントハンドラーに記述するrerender-derived-state— 生の値ではなく、導出した真偽値を購読するrerender-functional-setstate— コールバックを安定させるため、関数形式の setState を使うrerender-lazy-state-init— コストの高い値には、関数を useState に渡すrerender-transitions— 緊急性の低い更新には startTransition を使うrerender-use-ref-transient-values— 頻繁に変化する一時的な値には ref を使う
5. useEffect のパターン(MEDIUM)
useeffect-anti-patterns— よくある誤り:effect 内での導出 state、effect の連鎖、親への通知useeffect-alternatives— 判断フローと代替手段:導出 state、key prop、イベントハンドラー、useSyncExternalStore
6. レンダリングパフォーマンス(MEDIUM)
rendering-animate-svg-wrapper— SVG 要素ではなく、div のラッパーをアニメーションさせるrendering-content-visibility— 長いリストには content-visibility を使うrendering-hoist-jsx— 静的な JSX はコンポーネントの外に切り出すrendering-svg-precision— SVG 座標の精度を下げるrendering-conditional-render— 条件分岐には && ではなく三項演算子を使うrendering-usetransition-loading— ローディング状態には useTransition を優先する
7. JavaScript のパフォーマンス(低〜中)
js-batch-dom-css— レイアウトのスラッシングを避けるため、DOM の読み取りと書き込みをまとめる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— 関数から早期に戻るjs-hoist-regexp— ループの外で RegExp の作成を行うjs-min-max-loop— 最小値/最大値の取得には sort ではなくループを使うjs-set-map-lookups— O(1) の検索には Set/Map を使うjs-tosorted-immutable— 不変性を保つために toSorted() を使う
8. 高度なパターン(低)
advanced-init-once— アプリの読み込みごとに 1 回だけアプリを初期化するadvanced-event-handler-refs— イベントハンドラーを refs に保存するadvanced-use-latest— 安定したコールバック refs には useEffectEvent を使う
使用方法
詳しい説明とコード例については、個々のリファレンスファイルをお読みください。
references/async-parallel.md
references/rerender-derived-state-no-effect.md
references/useeffect-anti-patterns.md
各リファレンスファイルには、次の内容が含まれています。
- 重要な理由についての簡単な説明
- 誤ったコード例とその説明
- 正しいコード例とその説明
- 追加の背景情報と参考資料
コメント
Markdown 対応