vercel-react-best-practices
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.
Security Notice (Critical)
IMPORTANT: Code security must be maintained during performance optimization.
- Never expose sensitive data when optimizing data serialization
- Sanitize user-supplied code before rendering or evaluation
- Validate all dynamic output to prevent injection attacks
- Never use HTML comments (
<!-- -->) to store sensitive information - Avoid direct evaluation or insertion of code samples without validation
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
Understanding the Rules
Each rule includes:
- Name: Identifier for the optimization pattern
- Description: Concise explanation of what the rule addresses
- Code Examples: Showing incorrect (before) and correct (after) implementations
- Impact Level: Priority rating to guide optimization efforts
Rule Enforcement
When reviewing code:
- Critical rules: Must be addressed immediately (waterfalls, bundle bloat)
- High rules: Should be fixed in current PR if feasible
- Medium rules: Note for future optimization or current work if easy
- Low rules: Consider for dedicated performance optimization efforts
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 usedasync-parallel- Use Promise.all() for independent operationsasync-dependencies- Use better-all for partial dependenciesasync-api-routes- Start promises early, await late in API routesasync-suspense-boundaries- Use Suspense to stream content
2. Bundle Size Optimization (CRITICAL)
bundle-barrel-imports- Import directly, avoid barrel filesbundle-dynamic-imports- Use next/dynamic for heavy componentsbundle-defer-third-party- Load analytics/logging after hydrationbundle-conditional- Load modules only when feature is activatedbundle-preload- Preload on hover/focus for perceived speed
3. Server-Side Performance (HIGH)
server-auth-actions- Authenticate server actions like API routesserver-cache-react- Use React.cache() for per-request deduplicationserver-cache-lru- Use LRU cache for cross-request cachingserver-dedup-props- Avoid duplicate serialization in RSC propsserver-serialization- Minimize data passed to client componentsserver-parallel-fetching- Restructure components to parallelize fetchesserver-after-nonblocking- Use after() for non-blocking operations
4. Client-Side Data Fetching (MEDIUM-HIGH)
client-swr-dedup- Use SWR for automatic request deduplicationclient-event-listeners- Deduplicate global event listenersclient-passive-event-listeners- Use passive listeners for scrollclient-localstorage-schema- Version and minimize localStorage data
5. Re-render Optimization (MEDIUM)
rerender-defer-reads- Don't subscribe to state only used in callbacksrerender-memo- Extract expensive work into memoized componentsrerender-memo-with-default-value- Hoist default non-primitive propsrerender-dependencies- Use primitive dependencies in effectsrerender-derived-state- Subscribe to derived booleans, not raw valuesrerender-derived-state-no-effect- Derive state during render, not effectsrerender-functional-setstate- Use functional setState for stable callbacksrerender-lazy-state-init- Pass function to useState for expensive valuesrerender-simple-expression-in-memo- Avoid memo for simple primitivesrerender-move-effect-to-event- Put interaction logic in event handlersrerender-transitions- Use startTransition for non-urgent updatesrerender-use-ref-transient-values- Use refs for transient frequent values
6. Rendering Performance (MEDIUM)
rendering-animate-svg-wrapper- Animate div wrapper, not SVG elementrendering-content-visibility- Use content-visibility for long listsrendering-hoist-jsx- Extract static JSX outside componentsrendering-svg-precision- Reduce SVG coordinate precisionrendering-hydration-no-flicker- Use inline script for client-only datarendering-hydration-suppress-warning- Suppress expected mismatchesrendering-activity- Use Activity component for show/hiderendering-conditional-render- Use ternary, not && for conditionalsrendering-usetransition-loading- Prefer useTransition for loading state
7. JavaScript Performance (LOW-MEDIUM)
js-batch-dom-css- Group CSS changes via classes or cssTextjs-index-maps- Build Map for repeated lookupsjs-cache-property-access- Cache object properties in loopsjs-cache-function-results- Cache function results in module-level Mapjs-cache-storage- Cache localStorage/sessionStorage readsjs-combine-iterations- Combine multiple filter/map into one loopjs-length-check-first- Check array length before expensive comparisonjs-early-exit- Return early from functionsjs-hoist-regexp- Hoist RegExp creation outside loopsjs-min-max-loop- Use loop for min/max instead of sortjs-set-map-lookups- Use Set/Map for O(1) lookupsjs-tosorted-immutable- Use toSorted() for immutability
8. Advanced Patterns (LOW)
advanced-event-handler-refs- Store event handlers in refsadvanced-init-once- Initialize app once per app loadadvanced-use-latest- useLatest for stable callback refs
Additional Best Practices
Accessibility (a11y)
Ensure performance optimizations don't compromise accessibility:
- Lazy loading must not break keyboard navigation
- Dynamic imports should maintain focus management
- Animations should respect
prefers-reduced-motion - Loading states should be announced to screen readers
- Use semantic HTML even when optimizing for performance
Testing and Error Boundaries
Integrate performance with reliability:
- Test code coverage after refactoring for performance
- Implement error boundaries around Suspense boundaries
- Test lazy-loaded components in isolation
- Validate that optimizations don't break functionality
- Monitor error rates after performance changes
Next.js Rendering Modes
Choose appropriate rendering strategy based on content requirements:
- SSG (Static): For content that rarely changes
- ISR (Incremental Static): For content with predictable update patterns
- SSR (Server-Side): For personalized or real-time content
- CSR (Client-Side): For highly interactive, user-specific data
- Document rendering mode choices clearly in code comments, but never include secrets (API keys, tokens), credentials, or internal-only endpoints in comments
State Management and Context (Essential)
- Split contexts by update frequency
- Use context selectors to minimize re-renders
- Keep context providers close to consumers
- Avoid prop drilling by using composition patterns
Advanced State Patterns
- Consider external stores (Zustand, Jotai) for global state
Monitoring and Profiling
Measure performance impact:
- Use React DevTools Profiler for component performance
- Monitor Core Web Vitals (LCP, FID, CLS)
- Track bundle size changes in CI/CD
- Set performance budgets for routes
- Profile before and after optimizations
- Use Lighthouse CI for automated performance checks
More from yldgio/anomalyco
dotnet
ASP.NET Core patterns, dependency injection, middleware, async/await, and security
5docker
Dockerfile best practices, security hardening, multi-stage builds, and image optimization
4github-actions
GitHub Actions workflow security, performance optimization, and best practices
4react
React component patterns, hooks best practices, state management, and performance optimization
3bicep
Azure Bicep IaC patterns, parameterization, security, and modular design
3azure-devops
Azure DevOps pipeline security, YAML structure, variable management, and deployment patterns
3