ワンクリックで
react-three-fiber
React Three Fiber (R3F) + Three.js + drei 最佳實踐。當需要建立 3D 場景、處理相機/光照、互動事件、動畫、效能優化時使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
React Three Fiber (R3F) + Three.js + drei 最佳實踐。當需要建立 3D 場景、處理相機/光照、互動事件、動畫、效能優化時使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | react-three-fiber |
| description | React Three Fiber (R3F) + Three.js + drei 最佳實踐。當需要建立 3D 場景、處理相機/光照、互動事件、動畫、效能優化時使用。 |
基於 2025/5 知識。版本基準:three ^0.170、@react-three/fiber ^9、@react-three/drei ^10。
pnpm add three @react-three/fiber @react-three/drei
pnpm add -D @types/three
import { Canvas } from '@react-three/fiber'
import { OrbitControls, Environment } from '@react-three/drei'
<Canvas camera={{ position: [5, 5, 5], fov: 50 }} dpr={[1, 2]} shadows>
<ambientLight intensity={0.4} />
<directionalLight position={[5, 10, 5]} castShadow />
<mesh>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color="orange" />
</mesh>
<OrbitControls />
</Canvas>
useFrame((state, delta) => {
// 每幀執行,不要 setState!用 ref 直接改 mesh
ref.current.rotation.y += delta
})
const { camera, gl, scene, size } = useThree()
OrbitControls / TrackballControls:相機控制PerspectiveCamera makeDefault:自訂主相機Environment preset="city":HDR 環境光Bounds:自動 fit 物件入鏡Html:3D 裡嵌 DOM( tooltip/label)useGLTF('/model.glb'):載 GLTF,記得 useGLTF.preload()Instances / Instance:大量重複物件用 instancing<mesh
onPointerDown={(e) => { e.stopPropagation(); /* e.point, e.face, e.object */ }}
onPointerOver={(e) => setHover(true)}
onPointerMissed={() => setSelected(null)}
>
事件會冒泡,要 stopPropagation() 阻止穿透。onPointerMissed 在點空白處觸發(適合取消選取)。
// 把 9 個 cubie 暫時 attach 到一個 Group,旋轉 Group,動畫完再 detach
const group = useRef<THREE.Group>(null!)
const pivot = useRef<THREE.Object3D>(new THREE.Object3D())
function rotateFace(cubies: THREE.Object3D[], axis: 'x'|'y'|'z', angle: number) {
cubies.forEach(c => pivot.current.attach(c))
// useFrame 內 lerp pivot.rotation[axis] 到 angle
// 完成後:cubies.forEach(c => scene.attach(c)) 把世界變換烘回各 cubie
}
關鍵:attach()(非 add())會保留世界座標。
new Vector3() 放元件頂層或 useMemo,不要 useFrame 內建。dpr={[1, 2]} 讓 R3F 自適應。<Instances>。THREE.MathUtils.lerp@react-spring/three(declarative)或 framer-motion-3dR3F v9 以後 primitive 元素型別在 @react-three/fiber 的 ThreeElements 已正確。若要擴充自訂元素:
import { extend } from '@react-three/fiber'
import { MyMaterial } from './myMaterial'
extend({ MyMaterial })
declare module '@react-three/fiber' {
interface ThreeElements { myMaterial: ThreeElement<typeof MyMaterial> }
}
R3F 元件難 unit test → 把 狀態/邏輯 拆出純函式測(如魔術方塊的 rotate 邏輯),元件只負責渲染。必要時用 @react-three/test-renderer。
cubejs (Rubik's Cube solver, Kociemba two-phase) 使用指南。當需要實作魔術方塊自動解法、狀態字串序列化、或 scramble 產生時使用。
msw-fetch-mock 套件使用指南(搭配 MSW v2 + Vitest)。當需要 mock HTTP 請求、測試 fetch 呼叫、驗證 API 互動時使用。
React 19 最佳實踐指南。當需要撰寫 React 元件、使用 Hooks、處理狀態管理、或搭配 TypeScript/Vite 開發時使用。
TDD (Test-Driven Development) 最佳實踐指南,搭配 Vitest + React Testing Library。當需要撰寫測試、實踐 Red-Green-Refactor、設計測試結構時使用。應在開發新功能時主動套用。
Test Doubles 最佳實踐指南(Vitest + TypeScript)。當需要選擇 Mock/Stub/Fake/Spy/Dummy、或討論測試隔離策略時使用。
Vite 6/7 最佳實踐指南。當需要初始化 Vite 專案、設定 plugin、配置 build、除錯 HMR、path alias 或整合 React/TS/Vitest 時使用。