Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

react-patterns

Vite + Cloudflare プロジェクト向けの React 19 パフォーマンスパターンおよびコンポーネント設計アーキテクチャを提供するスキルです。ウォーターフォールの排除・バンドル最適化・再レンダリング防止・boolean props に頼らない Composition パターン・サーバー/クライアント境界の設計・React 19 API の活用など、影響度順に並んだ 50 以上のルールを収録しています。React コンポーネントの実装・レビュー・リファクタリング時に活用でき、「react patterns」「react performance」「reduce re-renders」「fix waterfall」などをトリガーとして起動します。

description の原文を見る

React 19 performance patterns and composition architecture for Vite + Cloudflare projects. 50+ rules ranked by impact — eliminating waterfalls, bundle optimisation, re-render prevention, composition over boolean props, server/client boundaries, and React 19 APIs. Use when writing, reviewing, or refactoring React components. Triggers: 'react patterns', 'react review', 'react performance', 'optimise components', 'react best practices', 'composition patterns', 'why is it slow', 'reduce re-renders', 'fix waterfall'.

SKILL.md 本文

React Patterns

React 19 + Vite + Cloudflare Workers プロジェクト向けのパフォーマンスとコンポーネント構成パターン。新しいコンポーネント作成時のチェックリスト、既存コード監査時のレビューガイド、または何か遅かったり絡まっているように感じる場合のリファクタリングプレイブックとして使用します。

ルールは影響度でランク付けされています。MEDIUM なものに手を付ける前に CRITICAL な問題を修正してください。

適用のタイミング

  • 新しい React コンポーネントやページを書くとき
  • 既存コードのパフォーマンス問題をレビューするとき
  • props が多すぎたり、再レンダーが多いコンポーネントをリファクタリングするとき
  • 「なぜ遅いのか?」または「なぜこれが再レンダーされるのか?」をデバッグするとき
  • 再利用可能なコンポーネント ライブラリを構築するとき
  • マージ前のコードレビュー

1. ウォーターフォールの排除 (CRITICAL)

並列実行できるのに順序実行している非同期呼び出し。パフォーマンスの最大の敵です。

パターン問題修正方法
順序実行での awaitconst a = await getA(); const b = await getB();const [a, b] = await Promise.all([getA(), getB()]);
子での fetch親が render → 子が fetch → 孫が fetchfetch を最も近い共通祖先に上げ、データを下に渡す
Suspense の連鎖複数の Suspense 境界が順序に resolve するすべての非同期兄弟を囲む Suspense 境界を1つに
分岐の前に awaitconst data = await fetch(); if (condition) { use(data); }await を分岐内に移動 — 使わない可能性があるデータを fetch しない
import してから renderconst Component = await import('./Heavy'); return <Component />React.lazy() + <Suspense> を使う — fallback を即座に render

見つけ方: コンポーネント内で await を検索します。各 await がウォーターフォールの可能性です。2 つの await が独立していれば、並列実行すべきです。

2. バンドルサイズ (CRITICAL)

ユーザーがダウンロードする 1 KB は、待つ 1 KB です。

パターン問題修正方法
Barrel importimport { Button } from '@/components' がバレルファイル全体を pullimport { Button } from '@/components/ui/button' — 直接 import
コード分割なし重いコンポーネントが全ページで読み込まれるReact.lazy(() => import('./HeavyComponent')) + <Suspense>
サードパーティが読み込み時Analytics/tracking がアプリ render 前に読み込まれるhydration 後に読み込む: useEffect(() => { import('./analytics') }, [])
ライブラリ全体 importimport _ from 'lodash' (70KB)import debounce from 'lodash/debounce' (1KB)
Lucide tree-shakingimport * as Icons from 'lucide-react' (全アイコン)明示的なマップ: import { Home, Settings } from 'lucide-react'
重複した Reactライブラリが独自の React をバンドル → "Cannot read properties of null"vite.config.ts で resolve.dedupe: ['react', 'react-dom']

見つけ方: npx vite-bundle-visualizer — バンドルに何が含まれているかを表示します。

3. コンポーネント構成アーキテクチャ (HIGH)

コンポーネントの構成方法は、最適化の方法よりも重要です。

パターン問題修正方法
boolean prop の爆発<Card isCompact isClickable showBorder hasIcon isLoading>明示的なバリアント: <CompactCard>, <ClickableCard>
複合コンポーネント15 個の prop を持つ複雑なコンポーネント<Dialog>, <Dialog.Trigger>, <Dialog.Content> に分割 (共有 context 付き)
renderX props<Layout renderSidebar={...} renderHeader={...} renderFooter={...}>children + 名前付きスロットを使う: <Layout><Sidebar /><Header /></Layout>
状態のリフト兄弟コンポーネント間で状態を共有できない状態を親または context provider に移動
Provider 実装Consumer コードが状態管理の内部を知っているProvider がインターフェース { state, actions, meta } を公開 — 実装は隠す
インラインコンポーネントfunction Parent() { function Child() { ... } return <Child /> }Child を Parent の外で定義 — インラインコンポーネントは render のたびに remount する

テスト: コンポーネントが 5 個以上の boolean prop を持つなら、より多くの prop ではなく、コンポーネント構成が必要です。

4. 再レンダー防止 (MEDIUM)

すべての再レンダーが悪いわけではありません。目に見えるジャンクや無駄な計算を引き起こす再レンダーだけを修正します。

パターン問題修正方法
デフォルト object/array propsfunction Foo({ items = [] }) → render のたびに新しい配列 refHoist: const DEFAULT = []; function Foo({ items = DEFAULT })
effect での派生状態useEffect(() => setFiltered(items.filter(...)), [items])render 中に派生: const filtered = useMemo(() => items.filter(...), [items])
object 依存関係useEffect(() => {...}, [config]) → config が {} なら render のたびに発火プリミティブ deps を使う: useEffect(() => {...}, [config.id, config.type])
未使用の状態にサブスクライブ{ user, theme, settings } を読むが user だけ使うcontext を分割またはセレクタを使う: useSyncExternalStore
一時的な値を state にconst [mouseX, setMouseX] = useState(0) on mousemove頻繁に変わるが再レンダー不要な値は useRef を使う
インラインコールバック props<Button onClick={() => doThing(id)} /> — render のたびに新しい関数useCallback または関数型 setState を使う: <Button onClick={handleClick} />

見つけ方: React DevTools Profiler → "Why did this render?" または <React.StrictMode> が開発時に double-render します。

5. React 19 固有事項 (MEDIUM)

React 19 で変わったまたは新しいパターン。

パターン旧 (React 18)新 (React 19)
フォーム状態useFormStateuseActionState — 名前変更
Ref forwardingforwardRef((props, ref) => ...)function Component({ ref, ...props }) — ref は通常の prop
ContextuseContext(MyContext)use(MyContext) — 条件分岐とループ内で動作
保留中 UI手動ローディング状態useTransition + startTransition (非緊急更新用)
ルートレベル lazycreateBrowserRouter のみで動作<Route lazy={...}><BrowserRouter> では無視
楽観的更新手動の状態管理useOptimistic hook
メタデータHelmet または手動 <head> 管理JSX で <title>, <meta>, <link> — 自動的に <head> に hoisted

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

パターン問題修正方法
読み込み時のレイアウトシフト非同期データ到着時にコンテンツが移動最終的なレイアウト寸法と一致するスケルトン画面
SVG を直接アニメーションSVG アニメーションがぎこちない<div> でラップし、div をアニメーション
大規模リストレンダリングテーブル/リストに 1000+ アイテム@tanstack/react-virtual で仮想化レンダリング
content-visibility長いスクロール可能なコンテンツが最初にすべて render されるオフスクリーンセクションで content-visibility: auto
&& での条件付き render{count && <Items />} は count が 0 のときに 0 を renderternary を使う: {count > 0 ? <Items /> : null}

7. データ取得 (MEDIUM)

パターン問題修正方法
重複排除なし同じデータが 3 つのコンポーネントで fetch されるTanStack Query または SWR — 自動重複排除 + キャッシング
mount での fetchuseEffect(() => { fetch(...) }, []) — ウォーターフォール、キャッシュなし、重複排除なしTanStack Query: useQuery({ queryKey: ['users'], queryFn: fetchUsers })
楽観的更新なしユーザーが save をクリック、2 秒待機、その後変更を確認useMutationonMutate で即座に視覚的フィードバック
interval での古いクロージャsetInterval が古い状態を captureinterval ID と現在の値に useRef を使う
cleanup なし pollinguseEffectsetIntervalclearInterval がないcleanup を返す: useEffect(() => { const id = setInterval(...); return () => clearInterval(id); })

8. Vite + Cloudflare 固有事項 (MEDIUM)

パターン問題修正方法
Node スクリプトでの import.meta.env未定義 — Vite 処理ファイルでのみ動作vite から loadEnv() を使う
React 重複インスタンスライブラリが独自の React をバンドルvite.config.ts で resolve.dedupe + optimizeDeps.include
Radix Select 空文字列<SelectItem value=""> が throwSentinel を使う: <SelectItem value="__any__">
React Hook Form null{...field} が Input に null を渡す手動で spread: value={field.value ?? ''}
Edge でのenv varsWorkers に process.env が存在しないc.env (Hono context) または import.meta.env (Vite build-time) を使う

レビューチェックリストとしての使用

コードレビュー時、すべての PR でカテゴリ 1-3 (CRITICAL + HIGH) をチェックします。カテゴリ 4-8 はパフォーマンスが関心事の場合のみ。

/react-patterns [file or component path]

ファイルを読み、優先順でルールに照らし合わせ、結果を以下として報告します:

file:line — [rule] 問題の説明

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
jezweb
リポジトリ
jezweb/claude-skills
ライセンス
MIT
最終更新
不明

Source: https://github.com/jezweb/claude-skills / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: jezweb · jezweb/claude-skills · ライセンス: MIT