bulletproof-react-components について
SSR、水和、レンダリング、ポータル、状態の安定性などを扱う9つのパターンで、再利用可能な React コンポーネントの作成とレビューを支援するスキルです。ルール、チェックリスト、詳しい例を含みます。
主な機能
- 01React の堅牢性を高める9パターン
- 02クイックルールと出荷前チェックリスト
- 03patterns.md の詳しい例
- 04固定形式の表によるレビュー結果
活用シーン
- 01リリース前の再利用可能なコンポーネントのレビュー
- 02サーバーレンダリング中のブラウザー API 呼び出しの回避
- 03コンポーネント間の ID と状態の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ codewithshreyans/ skills --skill bulletproof-react-componentsインストール後、Claude Code で/bulletproof-react-componentsを入力して読み込まれたか確認します。
同梱ファイルreferences/patterns.md
詳細
堅牢な React コンポーネント
ハッピーパス以外の実環境でも React コンポーネントが機能するようにする 9 つのパターンです。SSR、ハイドレーション、並行レンダリング、ポータルなどに対応します。
ソース:shud.in/thoughts/build-bulletproof-react-components
仕組み
- 再利用可能な React コンポーネントを作成またはレビューする際は、以下のクイックルールを参照します
- コード例と詳しい説明については、
./references/patterns.mdを読みます - リリース前にチェックリストを確認します
クイックルール
| # | パターン | ルール |
|---|---|---|
| 1 | サーバー対応 | レンダリング中にブラウザー API(localStorage、window、document)を呼び出してはいけません。useEffect を使用します。 |
| 2 | ハイドレーション対応 | React のハイドレーション前にクライアント依存の値を設定するため、同期インライン <script> を挿入します。 |
| 3 | インスタンス対応 | 生成する ID にはすべて useId() を使用します。再利用可能なコンポーネントで ID をハードコードしてはいけません。 |
| 4 | 並行処理対応 | リクエストごとの呼び出しを重複排除するため、サーバーのデータ取得を React.cache() でラップします。 |
| 5 | コンポジション対応 | React.cloneElement() の代わりに Context を使用します。cloneElement は Server Components、lazy、memo で問題を引き起こします。 |
| 6 | ポータル対応 | イベントリスナーにはグローバルな window ではなく、ref.current?.ownerDocument.defaultView || window を使用します。 |
| 7 | トランジション対応 | View Transition API のアニメーションを有効にするため、状態更新を startTransition() でラップします。 |
| 8 | Activity 対応 | <Activity> によって非表示になったときに DOM の副作用(例:<style> タグ)を無効にするには、useLayoutEffect を使用します。 |
| 9 | 将来対応 | 安定した同一性には useState(() => value) を使用します。useMemo はパフォーマンス上のヒントにすぎず、React が破棄する可能性があります。 |
チェックリスト
再利用可能な React コンポーネントを作成する際に、次の点を確認します。
- レンダリング中にブラウザー API を呼び出していない(サーバー対応)
- クライアントストレージの値がハイドレーション時に一瞬ちらつかない(ハイドレーション対応)
- ID をハードコードせず、
useId()を使用している(インスタンス対応) - サーバーのデータ取得を
cache()でラップしている(並行処理対応) -
cloneElementの代わりに Context を使用している(コンポジション対応) - イベントリスナーに
ownerDocument.defaultViewを使用している(ポータル対応) - 必要な箇所で状態更新を
startTransition()でラップしている(トランジション対応) - DOM の副作用が
<Activity>の表示状態に従っている(Activity 対応) - 安定した値に
useMemoではなくuseStateの初期化関数を使用している(将来対応)
結果をユーザーに提示する
これらのパターンに照らしてコンポーネントをレビューする際は、次の形式にします。
**Bulletproof Check: `<ComponentName>`**
| Pattern | Status | Notes |
|---------|--------|-------|
| Server-Proof | PASS/FAIL | ... |
| ... | ... | ... |
**Suggested fixes:**
1. ...
参考資料
./references/patterns.md— 9 つすべてのパターンについて、詳細なコード例(悪い例/良い例)を掲載
コメント
Markdown 対応