بنقرة واحدة
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 المهني
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 時使用。
| 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。