React render performance patterns including React Compiler integration, memoization strategies, TanStack Virtual, and DevTools profiling. Use when debugging slow renders, optimizing large lists, or reducing unnecessary re-renders.
View on GitHubyonatangross/skillforge-claude-plugin
ork-frontend-performance
plugins/ork-frontend-performance/skills/render-optimization/SKILL.md
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/yonatangross/skillforge-claude-plugin/blob/main/plugins/ork-frontend-performance/skills/render-optimization/SKILL.md -a claude-code --skill render-optimizationInstallation paths:
.claude/skills/render-optimization/# React Render Optimization
Modern render performance patterns for React 19+.
## Decision Tree: React Compiler First (2026)
```
Is React Compiler enabled?
├─ YES → Let compiler handle memoization automatically
│ Only use useMemo/useCallback as escape hatches
│ DevTools shows "Memo ✨" badge
│
└─ NO → Profile first, then optimize
1. React DevTools Profiler
2. Identify actual bottlenecks
3. Apply targeted optimizations
```
## React Compiler (Primary Approach)
React 19's compiler automatically memoizes:
- Component re-renders
- Intermediate values (like useMemo)
- Callback references (like useCallback)
- JSX elements
```tsx
// next.config.js (Next.js 16+)
const nextConfig = {
reactCompiler: true,
}
// Expo SDK 54+ enables by default
```
**Verification**: Open React DevTools → Look for "Memo ✨" badge
## When Manual Memoization Still Needed
Use `useMemo`/`useCallback` as escape hatches when:
```tsx
// 1. Effect dependencies that shouldn't trigger re-runs
const stableConfig = useMemo(() => ({
apiUrl: process.env.API_URL
}), [])
useEffect(() => {
initializeSDK(stableConfig)
}, [stableConfig])
// 2. Third-party libraries without compiler support
const memoizedValue = useMemo(() =>
expensiveThirdPartyComputation(data), [data])
// 3. Precise control over memoization boundaries
const handleClick = useCallback(() => {
// Critical callback that must be stable
}, [dependency])
```
## Virtualization Thresholds
| Item Count | Recommendation |
|------------|----------------|
| < 100 | Regular rendering usually fine |
| 100-500 | Consider virtualization |
| 500+ | Virtualization required |
```tsx
import { useVirtualizer } from '@tanstack/react-virtual'
const virtualizer = useVirtualizer({
count: items.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 50,
overscan: 5,
})
```
## State Colocation
Move state as close to where it's used as possible:
```tsx
// ❌ State too high - causes unnec