r3f-best-practices
React Three Fiber(R3F)およびPoimandresエコシステムのベストプラクティスを提供するスキルです。@react-three/fiber、@react-three/drei、zustand、@react-three/postprocessing、@react-three/rapier、levaを使用したコードの作成・レビュー・最適化を行う際に自動的に適用されます。R3F関連の実装品質を高めたい場面で活用してください。
description の原文を見る
React Three Fiber (R3F) and Poimandres ecosystem best practices. Use when writing, reviewing, or optimizing R3F code. Triggers on tasks involving @react-three/fiber, @react-three/drei, zustand, @react-three/postprocessing, @react-three/rapier, or leva.
SKILL.md 本文
React Three Fiber ベストプラクティス
React Three Fiber と Poimandres エコシステムの包括的ガイド。12 カテゴリにわたる 70+ のルールを含み、影響度順に優先付けされています。
ソースとクレジット
Utsubo による 100 Three.js Tips からの追加ヒント
適用場面
以下の場合にこれらのガイドラインを参照してください:
- 新しい R3F コンポーネントを作成する時
- R3F パフォーマンスを最適化する時(再レンダリングが #1 の問題)
- Drei ヘルパーを正しく使用する時
- Zustand で状態を管理する時
- ポストプロセッシングまたはフィジックスを実装する時
エコシステムのカバレッジ
- @react-three/fiber - Three.js 用 React レンダラー
- @react-three/drei - 便利なヘルパーと抽象化
- @react-three/postprocessing - ポストプロセッシングエフェクト
- @react-three/rapier - フィジックスエンジン
- zustand - 状態管理
- leva - デバッグ GUI
ルールカテゴリー(優先度順)
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | パフォーマンス・再レンダリング | 重大 | perf- |
| 2 | useFrame・アニメーション | 重大 | frame- |
| 3 | コンポーネントパターン | 高 | component- |
| 4 | Canvas・セットアップ | 高 | canvas- |
| 5 | Drei ヘルパー | 中-高 | drei- |
| 6 | ローディング・Suspense | 中-高 | loading- |
| 7 | 状態管理 | 中 | state- |
| 8 | イベント・インタラクション | 中 | events- |
| 9 | ポストプロセッシング | 中 | postpro- |
| 10 | フィジックス(Rapier) | 低-中 | physics- |
| 11 | Leva(デバッグ GUI) | 低 | leva- |
クイックリファレンス
1. パフォーマンス・再レンダリング(重大)
perf-never-set-state-in-useframe- useFrame 内で setState を呼び出さないperf-isolate-state- React 状態が必要なコンポーネントを分離するperf-zustand-selectors- 全ストアではなく Zustand セレクターを使用するperf-transient-subscriptions- 連続値に一時的なサブスクリプションを使用するperf-memo-components- 高コストなコンポーネントをメモ化するperf-keys-for-lists- 動的リストに安定したキーを使用するperf-avoid-inline-objects- JSX 内でオブジェクト/配列を作成しないperf-dispose-auto- R3F の自動破棄動作を理解するperf-visibility-toggle- 再マウントではなく表示/非表示を切り替えるperf-r3f-perf- パフォーマンス監視に r3f-perf を使用する
2. useFrame・アニメーション(重大)
frame-priority- 実行順序に priority を使用するframe-delta-time- アニメーションに常に delta を使用するframe-conditional-subscription- 不要な場合は useFrame を無効にするframe-destructure-state- 必要な値だけを分割代入するframe-render-on-demand- オンデマンドレンダリングに invalidate() を使用するframe-avoid-heavy-computation- 重い処理は useFrame の外に移動する
3. コンポーネントパターン(高)
component-jsx-elements- Three.js オブジェクトに JSX を使用するcomponent-attach-prop- 非標準プロパティに attach を使用するcomponent-primitive- 既存オブジェクトに primitive を使用するcomponent-extend- カスタムクラスに extend() を使用するcomponent-forwardref- 再利用可能なコンポーネントに forwardRef を使用するcomponent-dispose-null- 共有リソースに dispose={null} を設定する
4. Canvas・セットアップ(高)
canvas-size-container- Canvas は親コンテナいっぱいに表示されるcanvas-camera-default- Canvas prop 経由でカメラを設定するcanvas-gl-config- WebGL コンテキストを設定するcanvas-shadows- Canvas レベルでシャドウを有効にするcanvas-frameloop- 適切な frameloop モードを選択するcanvas-events- イベントハンドリングを設定するcanvas-linear-flat- 正しい色のために linear/flat を使用する
5. Drei ヘルパー(中-高)
drei-use-gltf- プリロード付き useGLTFdrei-use-texture- テクスチャ読み込みに useTexture を使用するdrei-environment- リアルなライティングに Environment を使用するdrei-orbit-controls- Drei の OrbitControlsdrei-html- DOM オーバーレイに Html を使用するdrei-text- 3D テキストに Text を使用するdrei-instances- 最適化されたインスタンシングに Instances を使用するdrei-use-helper- デバッグ可視化に useHelper を使用するdrei-bounds- カメラをフィットさせるのに Bounds を使用するdrei-center- オブジェクトを中央配置するのに Center を使用するdrei-float- フローティングアニメーションに Float を使用する
6. ローディング・Suspense(中-高)
loading-suspense- 非同期コンポーネントを Suspense でラップするloading-preload- useGLTF.preload でアセットをプリロードするloading-use-progress- ローディング UI に useProgress を使用するloading-lazy-components- 重いコンポーネントを遅延ロードするloading-error-boundary- ローディングエラーを処理する
7. 状態管理(中)
state-zustand-store- 焦点を絞った Zustand ストアを作成するstate-avoid-objects-in-store- Three.js オブジェクトはストア内で注意するstate-subscribeWithSelector- 細粒度のサブスクリプションstate-persist- 必要に応じて状態を永続化するstate-separate-concerns- 関心別にストアを分離する
8. イベント・インタラクション(中)
events-pointer-events- メッシュにポインターイベントを使用するevents-stop-propagation- イベントのバブリングを防ぐevents-cursor-pointer- ホバー時にカーソルを変更するevents-raycast-filter- レイキャストをフィルタリングするevents-event-data- イベントデータ構造を理解する
9. ポストプロセッシング(中)
postpro-effect-composer- EffectComposer を使用するpostpro-common-effects- 一般的なエフェクトリファレンスpostpro-selective-bloom- 最適化されたグローに SelectiveBloom を使用するpostpro-custom-shader- カスタムエフェクトを作成するpostpro-performance- ポストプロセッシングを最適化する
10. フィジックス Rapier(低-中)
physics-setup- 基本的な Rapier セットアップphysics-body-types- dynamic、fixed、kinematicphysics-colliders- 適切なコライダーを選択するphysics-events- 衝突イベントを処理するphysics-api-ref- フィジックス API に ref を使用するphysics-performance- フィジックスを最適化する
11. Leva(低)
leva-basic- 基本的な Leva 使用法leva-folders- フォルダーで整理するleva-conditional- 本番環境では非表示にする
使用方法
詳細な説明とコード例については個別のルールファイルを参照してください:
rules/perf-never-set-state-in-useframe.md
rules/drei-use-gltf.md
rules/state-zustand-selectors.md
完全コンパイルドキュメント
すべてのルールを拡張した完全なガイド:../R3F_BEST_PRACTICES.md
重大パターン
useFrame 内で setState を使用しない
// 悪い例 - 1 秒に 60 回の再レンダリング!
function BadComponent() {
const [position, setPosition] = useState(0);
useFrame(() => {
setPosition(p => p + 0.01); // これは絶対しないこと
});
return <mesh position-x={position} />;
}
// 良い例 - ref を直接ミューテートする
function GoodComponent() {
const meshRef = useRef();
useFrame(() => {
meshRef.current.position.x += 0.01;
});
return <mesh ref={meshRef} />;
}
Zustand セレクター
// 悪い例 - ストアが変更されるたびに再レンダリング
const store = useGameStore();
// 良い例 - playerX が変更された時だけ再レンダリング
const playerX = useGameStore(state => state.playerX);
// より良い例 - 再レンダリングなし、直接ミューテーション
useFrame(() => {
const { value } = useStore.getState();
ref.current.position.x = value;
});
Drei useGLTF
import { useGLTF } from '@react-three/drei';
function Model() {
const { scene } = useGLTF('/model.glb');
return <primitive object={scene} />;
}
// 即座のロードのためプリロードする
useGLTF.preload('/model.glb');
Suspense ローディング
function App() {
return (
<Canvas>
<Suspense fallback={<Loader />}>
<Model />
</Suspense>
</Canvas>
);
}
r3f-perf 監視
import { Perf } from 'r3f-perf';
function App() {
return (
<Canvas>
<Perf position="top-left" />
<Scene />
</Canvas>
);
}
表示/非表示を切り替える(再マウントではなく)
// 悪い例:再マウントすると破棄され再作成される
{showModel && <Model />}
// 良い例:可視性を切り替える、インスタンスを維持
<Model visible={showModel} />
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- emalorenzo
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/emalorenzo/three-agent-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。