
React Best Practices
FreeOptimize your React code for performance and maintainability.
Free · Opens the source repo
What React Best Practices does
The React Best Practices skill provides a comprehensive set of guidelines aimed at enhancing the performance and quality of React applications. It encompasses 26 rules organized into 9 categories, each focusing on critical aspects of React development such as component structure, rendering performance, and testing strategies. This skill is particularly useful for developers who are writing new components, optimizing existing code, or conducting code reviews to identify potential performance issues.
Each rule is accompanied by detailed explanations, examples, and metrics to help developers understand the impact of various practices on application performance. For instance, the guidelines emphasize critical patterns like eliminating waterfalls in asynchronous operations using Promise.all() and reducing bundle sizes by avoiding barrel imports. These practices are essential for ensuring that React applications are not only functional but also efficient and scalable.
The skill is designed for both new and experienced React developers who want to adhere to best practices while writing, reviewing, or refactoring code. By following these guidelines, developers can significantly improve the maintainability of their code and enhance the user experience through faster load times and smoother interactions. The skill also addresses common pitfalls in React development, such as improper state management and inefficient rendering patterns, providing actionable advice to avoid these issues.
In summary, the React Best Practices skill serves as a vital resource for developers looking to optimize their React applications, ensuring that they follow industry-standard practices that lead to better performance and maintainability.
When to use it
Use this skill when writing new React components, optimizing existing code, or conducting performance reviews.
When not to use it
This skill may not be suitable for projects that do not use React or for developers seeking general programming best practices outside of React.
What you can build with it
Writing New Components
When creating new React components, reference the guidelines to ensure optimal performance from the start.
Refactoring Existing Code
Use the skill to identify performance issues and apply best practices during the refactoring process.
Conducting Code Reviews
Incorporate the guidelines into your code review process to catch potential performance pitfalls before deployment.
How to install React Best Practices
View source1. Install with the skills CLI
npx skills add mastra-ai/mastra/react-best-practices --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by mastra-aiReact Best Practices
Overview
Routing and priority guide for React performance and quality, containing 26 rules across 9 categories. Rule files hold the detailed explanations, examples, review smells, and impact metrics.
When to Apply
Reference these guidelines when:
- Writing new React components
- Implementing data fetching
- Reviewing code for performance issues
- Refactoring existing React code
- Optimizing bundle size or load times
Priority-Ordered Guidelines
Rules are prioritized by impact:
| Priority | Category | Impact |
|---|---|---|
| 1 | Eliminating Waterfalls | CRITICAL |
| 2 | Bundle Size Optimization | CRITICAL |
| 3 | Client-Side Data Fetching | MEDIUM-HIGH |
| 4 | Re-render Optimization | MEDIUM |
| 5 | Rendering Performance | MEDIUM |
| 6 | JavaScript Performance | LOW-MEDIUM |
| 7 | Component Structure | MEDIUM-HIGH (maintainability) |
| 8 | Testing | MEDIUM-HIGH (correctness) |
| 9 | Type Safety | HIGH |
Quick Reference
Critical Patterns (Apply First)
Eliminate Waterfalls:
- Use
Promise.all()for independent async operations (async-parallel)
Reduce Bundle Size:
- Avoid barrel file imports, import directly from source (
bundle-barrel-imports) - Defer non-critical third-party libraries (
bundle-defer-third-party)
Medium-Impact Patterns
Client-Side Data Fetching:
- Use Tanstack Query for automatic request deduplication (
client-request-dedupe) - Dependent query params are the value or
undefined, never| nullor a fake fallback; narrow at the caller so hooks stay strict, or guard withskipTokenwhen the hook must accept an optional param (client-request-dedupe)
Re-render Optimization:
- Use lazy state initialization for expensive values (
rerender-lazy-state-init) - Apply
startTransitionfor non-urgent updates (rerender-transitions) - Keep UI handlers plain; use Effect Events only for effect-fired logic (
rerender-useeffect-function-calls) - Never reset state with
useEffect; lift the discriminant and remount the branch (rerender-no-useeffect-state-reset) - Never add
useMemooruseCallback; leave memoization decisions to developers with profiler evidence (rerender-no-usememo-usecallback) - Never call
setStateduring render or insideuseEffect; derive during render or move state ownership to an intermediate component (rerender-no-setstate-in-render-or-effect)
Component Structure:
- One domain component/hook per file, one responsibility each — split bloated components (
structure-single-responsibility) - Keep component, hook, function, and utility APIs narrow: split oversized props, arguments, and return objects into focused units composed at the component level; wrapping the same values in one object is not a fix (
structure-narrow-apis) - Use PascalCase components for JSX-returning helpers; keep lowercase helpers for non-JSX values (
structure-component-naming) - Derive props/params instead of accepting a value computable from another arg (
structure-derive-dont-duplicate) - Extract complex derived logic into named locals plus predicates or pure helpers with early returns: oversized conditions, nested ternaries, ternaries that compute instead of picking (multi-line branches, or an
ascast re-asserting what the condition tested), fallback chains, andlet-based render prep are code smells, in render prep and in hook options, request builders, config maps, and reducers alike (structure-complex-derived-logic) - Pick the view with early
ifguards but keep the layout wrapper in one place — branch a body component, don't ternary or duplicate the shell (structure-early-return-render-branches) - For a fixed set of items, write one component per item with explicit props that owns its data and loading — don't map a config-object array onto a component shape (
structure-composition-over-config)
Testing:
- BDD tests that drive the real
@mastra/client-js+ React Query stack and mock only the network; nevervi.mockour own hooks/services/auth gating or the SDK (testing-bdd-no-mocks) - Avoid class-name assertions for visual behavior; prefer computed styles, user-visible behavior, or browser validation, and prefer no test over a className-only implementation mirror (
testing-no-classname-assertions)
Type Safety:
- No
astype assertions anywhere — production or tests; narrow with real type guards, query generics (querySelector<T>,getByRole<T>), typed fixture factories, orimplementson mocks.as constis the only allowed form. Do not replace a cast with a domain-type predicate that only checkstypeof value === 'object'; call that anisRecordhelper or validate the fields used (types-no-type-assertions) - Use
undefinedand optional?for absence, notnull; convert externalnullat boundaries, and keep leaf props strict so callers own absence and fallback rendering (types-no-null)
Rendering Patterns
- Animate SVG wrappers, not SVG elements directly (
rendering-animate-svg-wrapper) - Use
content-visibility: autofor long lists (rendering-content-visibility)
JavaScript Patterns
- Use Set/Map for repeated lookups (
js-set-map-lookups) - Use
toSorted()instead ofsort()for immutability (js-tosorted-immutable) - Early length check for array comparisons (
js-length-check-first)
References
Rule files are the canonical source for detailed guidance and examples:
references/react-best-practices-reference.md- Rule catalog with category order and rule-file pathsreferences/rules/- Canonical individual rule files organized by category
Load only the relevant rule file when implementing or reviewing a specific pattern. Use the catalog to choose the right rule without loading every example.
To look up a specific pattern, grep the rules directory:
grep -l "Promise.all" references/rules/
grep -l "barrel" references/rules/
grep -l "Tanstack" references/rules/
Rule Categories in references/rules/
async-*- Waterfall elimination (1 rule)bundle-*- Bundle size optimization (2 rules)client-*- Client-side data fetching (1 rule)rerender-*- Re-render optimization (6 rules)rendering-*- DOM rendering performance (2 rules)js-*- JavaScript micro-optimizations (3 rules)types-*- Type-safety / no-as-cast and no-nullrules (2 rules)structure-*- Component/hook/function/utility structure (7 rules)testing-*- BDD tests + mock-only-the-network policy + no className implementation-mirror assertions (2 rules)
Frequently asked questions about React Best Practices
Similar skills
Heap Snapshot Analysis
Investigate V8 heap snapshots for memory issues.
VS Code Performance Workflow
Automate performance investigations in VS Code.
Memory Leak Audit
Prevent memory leaks with effective coding patterns.
CPU Profile Analysis
Analyze V8 and Chrome performance profiles for optimization.
Chat Performance Testing
Benchmark and validate chat UI performance in VS Code.
Vercel React Best Practices
Optimize your React and Next.js applications for performance.
