Vercel React Best Practices
Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 57 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.
When to Apply
Reference these guidelines when:
- Writing new React components or Next.js pages
- Implementing data fetching (client or server-side)
- Reviewing code for performance issues
- Refactoring existing React/Next.js code
- Optimizing bundle size or load times
Rule Categories by Priority
| Priority | Category | Impact Prefix |
|---|---|---|
| 1 | Eliminating Waterfalls | CRITICAL (async-) |
| 2 | Bundle Size Optimization | CRITICAL (bundle-) |
| 3 | Server-Side Performance | HIGH (server-) |
| 4 | Client-Side Data Fetching | MEDIUM-HIGH (client-) |
| 5 | Re-render Optimization | MEDIUM (rerender-) |
| 6 | Rendering Performance | MEDIUM (rendering-) |
| 7 | JavaScript Performance | LOW-MEDIUM (js-) |
| 8 | Advanced Patterns | LOW (advanced-) |
Quick Reference
1. Eliminating Waterfalls (CRITICAL)
- async-defer-await: Move await into branches where actually used
- async-parallel: Use
Promise.all()for independent operations - async-dependencies: Use
better-allfor partial dependencies - async-api-routes: Start promises early, await late in API routes
- async-suspense-boundaries: Use Suspense to stream content
2. Bundle Size Optimization (CRITICAL)
- bundle-barrel-imports: Import directly, avoid barrel files
- bundle-dynamic-imports: Use
next/dynamicfor heavy components - bundle-defer-third-party: Load analytics/logging after hydration
- bundle-conditional: Load modules only when feature is activated
- bundle-preload: Preload on hover/focus for perceived speed
3. Server-Side Performance (HIGH)
- server-auth-actions: Authenticate server actions like API routes
- server-cache-react: Use
React.cache()for per-request deduplication - server-cache-lru: Use LRU cache for cross-request caching
- server-dedup-props: Avoid duplicate serialization in RSC props
- server-serialization: Minimize data passed to client components
- server-parallel-fetching: Restructure components to parallelize fetches
- server-after-nonblocking: Use
after()for non-blocking operations
4. Client-Side Data Fetching (MEDIUM-HIGH)
- client-swr-dedup: Use SWR for automatic request deduplication
- client-event-listeners: Deduplicate global event listeners
- client-passive-event-listeners: Use passive listeners for scroll
- client-localstorage-schema: Version and minimize localStorage data
5. Re-render Optimization (MEDIUM)
- rerender-defer-reads: Don't subscribe to state only used in callbacks
- rerender-memo: Extract expensive work into memoized components
- rerender-derived-state-no-effect: Derive state during render, not effects
- rerender-functional-setstate: Use functional setState for stable callbacks
- rerender-transitions: Use
startTransitionfor non-urgent updates - rerender-use-ref-transient-values: Use refs for transient frequent values
6. Rendering Performance (MEDIUM)
- rendering-content-visibility: Use
content-visibilityfor long lists - rendering-hoist-jsx: Extract static JSX outside components
- rendering-svg-precision: Reduce SVG coordinate precision
- rendering-usetransition-loading: Prefer
useTransitionfor loading state
7. JavaScript Performance (LOW-MEDIUM)
- js-batch-dom-css: Group CSS changes via classes or cssText
- js-index-maps: Build Map for repeated lookups
- js-combine-iterations: Combine multiple filter/map into one loop
- js-early-exit: Return early from functions
- js-set-map-lookups: Use Set/Map for O(1) lookups
8. Advanced Patterns (LOW)
- advanced-event-handler-refs: Store event handlers in refs
- advanced-init-once: Initialize app once per app load
- advanced-use-latest:
useLatestfor stable callback refs