r3f-best-practices
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.
By emalorenzo · 1,154 installs
npx skills add emalorenzo/three-agent-skills --skill r3f-best-practices
Source repository · Upstream listing
React Three Fiber Best Practices
Comprehensive guide for React Three Fiber and the Poimandres ecosystem. Contains 70+ rules across 12 categories, prioritized by impact.
Sources & Credits
Additional tips from [100 Three.js Tips](https://www.utsubo.com/blog/threejs best practices 100 tips) by [Utsubo](https://www.utsubo.com)
When to Apply
Reference these guidelines when:
Writing new R3F components
Optimizing R3F performance (re renders are the 1 issue)
Using Drei helpers correctly
Managing state with Zustand
Implementing post processing or physics
Ecosystem Coverage
@react three/fiber React renderer for Three.js
@react three/drei Useful helpers and abstractions
@react three/postprocessing Post processing effects
@react three/rapier Physics engine
zustand State management
leva Debug GUI
Rule Categories by Priority
Priority Category Impact Prefix
1 Performance & Re renders CRITICAL perf
2 useFrame & Animation CRITICAL frame
3 Component Patterns HIGH component
4 Canvas & Setup HIGH canvas
5 Drei Helpers MEDIUM HIGH drei
6 Loading & Suspense MEDIUM HIGH loading
7 State Management MEDIUM state
8 Events & Interaction MEDIUM events
9 Post processing MEDIUM postpro
10 Physics (Rapier) LOW MEDIUM physics
11 Leva (Debug GUI) LOW leva
Quick Reference
1. Performance & Re renders (CRITICAL)
perf never set state in useframe NEVER call setState in useFrame
perf isolate state Isolate components that need React state
perf zustand selectors Use Zustand selectors, not entire store
perf transient subscriptions Use transient subscriptions for continuous values
perf memo components Memoize expensive components
perf keys for lists Use stable keys for dynamic lists
perf avoid inline objects Avoid creating objects/arrays in JSX
perf dispose auto Understand R3F auto dispose behavior
perf visibility toggle Toggle visibility instead of remounting
perf r3f perf Use r3f perf for performance monitoring
2. useFrame & Animation (CRITICAL)
frame priority Use priority for execution order
frame delta time Always use delta for animations
frame conditional subscription Disable useFrame when not needed
frame destructure state Destructure only what you need
frame render on demand Use invalidate() for on demand rendering
frame avoid heavy computation Move heavy work outside useFrame
3. Component Patterns (HIGH)
component jsx elements Use JSX for Three.js objects
component attach prop Use attach for non standard properties
component primitive Use primitive for existing objects
component extend Use extend() for custom classes
component forwardref Use forwardRef for reusable components
component dispose null Set dispose={null} on shared resources
4. Canvas & Setup (HIGH)
canvas size container Canvas fills parent container
canvas camera default Configure camera via prop
canvas gl config Configure WebGL context
canvas shadows Enable shadows at Canvas level
canvas frameloop Choose appropriate frameloop mode
canvas events Configure event handling
canvas linear flat Use linear/flat for correct colors
5. Drei Helpers (MEDIUM HIGH)
drei use gltf useGLTF with preloading
drei use texture useTexture for texture loading
drei environment Environment for realistic lighting
drei orbit controls OrbitControls from Drei
drei html Html for DOM overlays
drei text Text for 3D text
drei instances Instances for optimized instancing
drei use helper useHelper for debug visualization
drei bounds Bounds to fit camera
drei center Center to center objects
drei float Float for floating animation
6. Loading & Suspense (MEDIUM HIGH)
loading suspense Wrap async components in Suspense
loading preload Preload assets with useGLTF.preload
loading use progress useProgress for loading UI
loading lazy components Lazy load heavy components
loading error boundary Handle loading errors
7. State Management (MEDIUM)
state zustand store Create focused Zustand stores
state avoid objects in store Be careful with Three.js objects
state subscribeWithSelector Fine grained subscriptions
state persist Persist state when needed
state separate concerns Separate stores by concern
8. Events & Interaction (MEDIUM)
events pointer events Use pointer events on meshes
events stop propagation Prevent event bubbling
events cursor pointer Change cursor on hover
events raycast filter Filter raycasting
events event data Understand event data structure
9. Post processing (MEDIUM)
postpro effect composer Use EffectComposer
postpro common effects Common effects reference
postpro selective bloom SelectiveBloom for optimized glow
postpro custom shader Create custom effects
postpro performance Optimize post processing
10. Physics Rapier (LOW MEDIUM)
physics setup Basic Rapier setup
physics body types dynamic, fixed, kinematic
physics colliders Choose appropriate colliders
physics events Handle collision events
physics api ref Use ref for physics API
physics performance Optimize physics
11. Leva (LOW)
leva basic Basic Leva usage
leva folders Organize with folders
leva conditional Hide in production
How to Use
Read individual rule files for detailed explanations and code examples:
Full Compiled Document
For the complete guide with all rules expanded: ../R3F BEST PRACTICES.md
Critical Patterns
NEVER setState in useFrame
Zustand Selectors
Drei useGLTF
Suspense Loading
r3f perf Monitoring
Toggle Visibility (Not Remounting)