react-best-practices
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReact Best Practices
React最佳实践
Performance optimization guide for client-side React applications. Contains 47 rules across 8 categories, prioritized by impact. Adapted from Vercel Engineering's guidelines, filtered for client-only React + Vite (no Next.js / SSR).
面向客户端React应用的性能优化指南。包含8大类共47条规则,按影响优先级排序。改编自Vercel工程团队指南,筛选适配纯客户端React + Vite场景(不含Next.js / SSR)。
When to Apply
适用场景
Reference these guidelines when:
- Writing new React components or hooks
- Reviewing code for performance issues
- Refactoring existing React code
- Optimizing bundle size or render performance
- Writing or reviewing usage
useEffect
在以下场景中可参考本指南:
- 编写新的React组件或hooks
- 评审代码的性能问题
- 重构现有React代码
- 优化包体积或渲染性能
- 编写或评审用法
useEffect
Rule Categories by Priority
按优先级划分的规则类别
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Eliminating Waterfalls | CRITICAL | |
| 2 | Bundle Size Optimization | CRITICAL | |
| 3 | Client-Side Data Fetching | MEDIUM-HIGH | |
| 4 | Re-render Optimization | MEDIUM | |
| 5 | useEffect Patterns | MEDIUM | |
| 6 | Rendering Performance | MEDIUM | |
| 7 | JavaScript Performance | LOW-MEDIUM | |
| 8 | Advanced Patterns | LOW | |
| 优先级 | 类别 | 影响程度 | 前缀 |
|---|---|---|---|
| 1 | 消除瀑布流 | 关键 | |
| 2 | 包体积优化 | 关键 | |
| 3 | 客户端数据获取 | 中高 | |
| 4 | 重渲染优化 | 中等 | |
| 5 | useEffect使用模式 | 中等 | |
| 6 | 渲染性能 | 中等 | |
| 7 | JavaScript性能 | 中低 | |
| 8 | 高级模式 | 低 | |
Quick Reference
快速参考
1. Eliminating Waterfalls (CRITICAL)
1. 消除瀑布流(关键)
- — Move await into branches where actually used
async-defer-await - — Use Promise.all() for independent operations
async-parallel - — Use promise chaining for partial dependencies
async-dependencies - — Start promises early, await late
async-api-routes
- — 将await移到实际需要使用的分支中
async-defer-await - — 独立操作使用Promise.all()并行处理
async-parallel - — 存在部分依赖时使用Promise链式调用
async-dependencies - — 尽早启动Promise,延后await
async-api-routes
2. Bundle Size Optimization (CRITICAL)
2. 包体积优化(关键)
- — Import directly, avoid barrel files
bundle-barrel-imports - — Load modules only when feature is activated
bundle-conditional - — Load analytics/logging after mount
bundle-defer-third-party - — Preload on hover/focus for perceived speed
bundle-preload
- — 直接导入模块,避免桶文件
bundle-barrel-imports - — 仅在功能启用时加载对应模块
bundle-conditional - — 挂载后再加载分析/日志类第三方脚本
bundle-defer-third-party - — hover/聚焦时预加载资源以提升感知速度
bundle-preload
3. Client-Side Data Fetching (MEDIUM-HIGH)
3. 客户端数据获取(中高)
- — Deduplicate global event listeners
client-event-listeners - — Use passive listeners for scroll/touch
client-passive-event-listeners - — Use SWR for automatic request deduplication
client-swr-dedup - — Version and minimize localStorage data
client-localstorage-schema
- — 对全局事件监听器做去重处理
client-event-listeners - — 滚动/触摸事件使用passive监听器
client-passive-event-listeners - — 使用SWR实现请求自动去重
client-swr-dedup - — 对localStorage数据做版本管理并精简体积
client-localstorage-schema
4. Re-render Optimization (MEDIUM)
4. 重渲染优化(中等)
- — Derive state during render, not effects
rerender-derived-state-no-effect - — Don't subscribe to state only used in callbacks
rerender-defer-reads - — Avoid memo for simple primitives
rerender-simple-expression-in-memo - — Hoist default non-primitive props
rerender-memo-with-default-value - — Extract expensive work into memoized components
rerender-memo - — Use primitive dependencies in effects
rerender-dependencies - — Put interaction logic in event handlers
rerender-move-effect-to-event - — Subscribe to derived booleans, not raw values
rerender-derived-state - — Use functional setState for stable callbacks
rerender-functional-setstate - — Pass function to useState for expensive values
rerender-lazy-state-init - — Use startTransition for non-urgent updates
rerender-transitions - — Use refs for transient frequent values
rerender-use-ref-transient-values
- — 在渲染阶段派生状态,而非使用effects
rerender-derived-state-no-effect - — 不要订阅仅在回调中使用的状态
rerender-defer-reads - — 简单原始值避免使用memo
rerender-simple-expression-in-memo - — 将默认非原始值props提升到组件外
rerender-memo-with-default-value - — 将耗时逻辑提取到memo化组件中
rerender-memo - — 在effects中使用原始类型依赖项
rerender-dependencies - — 将交互逻辑放到事件处理函数中
rerender-move-effect-to-event - — 订阅派生的布尔值,而非原始值
rerender-derived-state - — 使用函数式setState获取稳定回调
rerender-functional-setstate - — 给useState传入函数以懒初始化高开销值
rerender-lazy-state-init - — 非紧急更新使用startTransition
rerender-transitions - — 频繁变化的临时值使用refs存储
rerender-use-ref-transient-values
5. useEffect Patterns (MEDIUM)
5. useEffect使用模式(中等)
- — Common mistakes: derived state in effects, effect chains, notifying parents
useeffect-anti-patterns - — Decision tree and alternatives: derived state, key prop, event handlers, useSyncExternalStore
useeffect-alternatives
- — 常见错误:在effects中使用派生状态、effect链、通知父组件
useeffect-anti-patterns - — 决策树与替代方案:派生状态、key prop、事件处理函数、useSyncExternalStore
useeffect-alternatives
6. Rendering Performance (MEDIUM)
6. 渲染性能(中等)
- — Animate div wrapper, not SVG element
rendering-animate-svg-wrapper - — Use content-visibility for long lists
rendering-content-visibility - — Extract static JSX outside components
rendering-hoist-jsx - — Reduce SVG coordinate precision
rendering-svg-precision - — Use ternary, not && for conditionals
rendering-conditional-render - — Prefer useTransition for loading state
rendering-usetransition-loading
- — 动画作用于div容器,而非SVG元素本身
rendering-animate-svg-wrapper - — 长列表使用content-visibility
rendering-content-visibility - — 将静态JSX提取到组件外部
rendering-hoist-jsx - — 降低SVG坐标精度
rendering-svg-precision - — 条件渲染使用三元表达式,而非&&
rendering-conditional-render - — 加载状态优先使用useTransition
rendering-usetransition-loading
7. JavaScript Performance (LOW-MEDIUM)
7. JavaScript性能(中低)
- — Batch DOM reads/writes to avoid layout thrashing
js-batch-dom-css - — Build Map for repeated lookups
js-index-maps - — Cache object properties in loops
js-cache-property-access - — Cache function results in module-level Map
js-cache-function-results - — Cache localStorage/sessionStorage reads
js-cache-storage - — Combine multiple filter/map into one loop
js-combine-iterations - — Check array length before expensive comparison
js-length-check-first - — Return early from functions
js-early-exit - — Hoist RegExp creation outside loops
js-hoist-regexp - — Use loop for min/max instead of sort
js-min-max-loop - — Use Set/Map for O(1) lookups
js-set-map-lookups - — Use toSorted() for immutability
js-tosorted-immutable
- — 批量处理DOM读写以避免布局抖动
js-batch-dom-css - — 构建Map用于重复查找
js-index-maps - — 在循环中缓存对象属性
js-cache-property-access - — 在模块级Map中缓存函数结果
js-cache-function-results - — 缓存localStorage/sessionStorage读取结果
js-cache-storage - — 将多次filter/map合并为一次循环
js-combine-iterations - — 高开销比较前先检查数组长度
js-length-check-first - — 函数尽早返回
js-early-exit - — 将RegExp创建提升到循环外部
js-hoist-regexp - — 使用循环求最值,而非sort
js-min-max-loop - — 使用Set/Map实现O(1)查找
js-set-map-lookups - — 使用toSorted()实现不可变性
js-tosorted-immutable
8. Advanced Patterns (LOW)
8. 高级模式(低)
- — Initialize app once per app load
advanced-init-once - — Store event handlers in refs
advanced-event-handler-refs - — useEffectEvent for stable callback refs
advanced-use-latest
- — 应用加载时仅初始化一次
advanced-init-once - — 将事件处理函数存储在refs中
advanced-event-handler-refs - — 使用useEffectEvent获取稳定的回调ref
advanced-use-latest
How to Use
使用方法
Read individual reference files for detailed explanations and code examples:
references/async-parallel.md
references/rerender-derived-state-no-effect.md
references/useeffect-anti-patterns.mdEach reference file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- Additional context and references
查阅各参考文件获取详细说明和代码示例:
references/async-parallel.md
references/rerender-derived-state-no-effect.md
references/useeffect-anti-patterns.md每个参考文件包含:
- 规则重要性的简要说明
- 错误代码示例及解释
- 正确代码示例及解释
- 额外背景与参考资料