网淘吧来吧,欢迎您!

React Best Practices技能使用说明

2026-03-29 新闻来源:网淘吧 围观:16
电脑广告
手机广告

React 最佳实践

来自 Vercel 工程团队的 React 和 Next.js 应用程序综合性能优化指南。包含 8 个类别下的 57 条规则,按影响程度排序。

安装

OpenClaw / Moltbot / Clawbot

npx clawhub@latest install react-best-practices

此技能的作用

为以下方面提供可操作的规则:

  • 消除请求瀑布流
  • 优化打包体积
  • 提升服务器端性能
  • 高效的客户端数据获取
  • 最小化重新渲染
  • 渲染性能优化
  • JavaScript 微优化
  • 针对边缘情况的高级模式

何时使用

  • 编写新的 React 组件或 Next.js 页面时
  • 实现数据获取时(客户端或服务器端)
  • 审查代码以查找性能问题时
  • 重构 React/Next.js 应用程序时
  • 优化打包体积或加载时间时
  • 调试缓慢渲染或瀑布流问题

关键词

React性能、Next.js优化、包体积、瀑布流、Suspense、服务器组件、RSC、重新渲染、useMemo、动态导入、并行获取、缓存、SWR

按优先级划分的规则类别

优先级类别影响程度规则前缀
1消除瀑布流关键async-
2包体积优化关键bundle-
3服务器端性能server-
4客户端数据获取中高client-
5重渲染优化中等rerender-
6渲染性能中等rendering-
7JavaScript 性能低-中等js-
8高级模式advanced-

快速参考

1. 消除瀑布流(关键)

规则描述
async-defer-await将 await 移至实际使用的分支中
async-parallel使用Promise.all()处理独立操作
异步依赖对部分依赖使用更好的方式
异步API路由在API路由中尽早启动Promise,稍后等待
异步Suspense边界使用Suspense流式传输内容

2. 打包体积优化(关键)

规则描述
打包-桶式导入直接导入,避免使用桶文件
打包-动态导入使用next/dynamic处理重量级组件
打包-延迟第三方在页面水合后加载分析/日志记录
打包-条件加载仅在功能激活时加载模块
打包-预加载在悬停/聚焦时预加载以提升感知速度

3. 服务器端性能(高优先级)

规则描述
服务器认证操作对API路由等服务器操作进行身份验证
服务器缓存-React使用React.cache()进行请求级去重
服务器缓存-LRU使用LRU缓存实现跨请求缓存
服务器去重-属性避免RSC属性中的重复序列化
服务器序列化最小化传递给客户端组件的数据
服务器并行获取重构组件以实现并行数据获取
服务器非阻塞后处理使用after()进行非阻塞操作

4. 客户端数据获取(中高优先级)

规则描述
客户端-SWR-去重使用 SWR 实现自动请求去重
客户端-事件监听器去重全局事件监听器
客户端-被动事件监听器为滚动事件使用被动监听器
客户端-本地存储架构版本化并最小化 localStorage 数据

5. 重新渲染优化(中等难度)

规则描述
重新渲染-延迟读取不要订阅仅用于回调的状态
重新渲染-记忆化将耗时工作提取到记忆化组件中
重新渲染-带默认值的记忆化提升默认非原始属性
重新渲染-依赖项在副作用中使用原始依赖项
重新渲染-派生状态订阅派生布尔值,而非原始值
在渲染时派生状态,而非在副作用中rerender-functional-setstate
使用函数式setState以获得稳定的回调rerender-lazy-state-init
对于开销较大的值,向useState传递函数rerender-simple-expression-in-memo
避免对简单原始值使用memorerender-move-effect-to-event
将交互逻辑放在事件处理器中rerender-transitions
使用startTransition处理非紧急更新rerender-use-ref-transient-values
使用ref处理频繁变化的临时值6. 渲染性能(中等)

规则

描述rendering-animate-svg-wrapper
动画化div包装器,而非SVG元素rendering-content-visibility
对长列表使用content-visibilityUse content-visibility for long lists
渲染提升JSX将静态JSX提取到组件外部
渲染SVG精度降低SVG坐标精度
渲染水合无闪烁对仅客户端数据使用内联脚本
渲染水合抑制警告抑制预期的不匹配
渲染活动使用Activity组件控制显示/隐藏
渲染条件渲染条件判断使用三元运算符,而非&&
渲染使用过渡加载加载状态优先使用useTransition

7. JavaScript性能(低-中)

规则描述
JS批量DOM CSS通过类或cssText分组CSS更改
JS索引映射为重复查找构建Map
JS缓存属性访问在循环中缓存对象属性
js-缓存函数结果在模块级Map中缓存函数结果
js-缓存存储缓存localStorage/sessionStorage读取
js-合并迭代将多个filter/map合并到单个循环中
js-优先检查长度在执行高开销操作前检查数组长度
js-提前退出从函数中提前返回
js-提升正则表达式将正则表达式创建提升到循环外部
js-最小最大值循环使用循环求最小/最大值而非排序
js-集合映射查找使用Set/Map实现O(1)复杂度查找
js-不可变排序使用toSorted()实现不可变性

8. 高级模式(低优先级)

规则描述
高级事件处理程序引用将事件处理程序存储在引用中
高级单次初始化每次应用加载时仅初始化一次
高级使用最新值useLatest 用于稳定的回调引用

使用方法

阅读单个规则

每个规则文件位于rules/目录下,包含:

  • 简要说明其重要性
  • 错误代码示例及解释
  • 正确代码示例及解释
  • 附加上下文和参考资料
rules/async-parallel.md
rules/bundle-barrel-imports.md
rules/rerender-memo.md

完整编译文档

如需包含所有规则详情的完整指南:AGENTS.md

这份2900多行的文档包含每个规则的完整代码示例和详细解释,适合全面参考。

关键模式

并行数据获取

// Bad: sequential
const user = await fetchUser()
const posts = await fetchPosts()

// Good: parallel
const [user, posts] = await Promise.all([
  fetchUser(),
  fetchPosts()
])

动态导入

// Bad: bundles Monaco with main chunk
import { MonacoEditor } from './monaco-editor'

// Good: loads on demand
const MonacoEditor = dynamic(
  () => import('./monaco-editor').then(m => m.MonacoEditor),
  { ssr: false }
)

函数式 setState

// Bad: stale closure risk
const addItem = useCallback((item) => {
  setItems([...items, item])
}, [items]) // recreates on every items change

// Good: always uses latest state
const addItem = useCallback((item) => {
  setItems(curr => [...curr, item])
}, []) // stable reference

切勿

  1. 切勿对可并行运行的操作顺序使用 await
  2. 切勿从桶文件导入(import { X } from 'lib')——应直接导入
  3. 切勿在服务器操作中跳过身份验证——应将其视为 API 路由
  4. 切勿向客户端组件传递整个对象,当仅需一个字段时
  5. 切勿 使用 &&对数字进行条件渲染——应使用三元运算符
  6. 切勿订阅仅用于事件处理程序的状态——应按需读取
  7. 切勿使用.sort()对数组进行原地排序——应使用.toSorted()
  8. 切勿将初始化操作置于useEffect([])中——请改用模块级守卫
免责申明
部分文章来自各大搜索引擎,如有侵权,请与我联系删除。
打赏
文章底部电脑广告
手机广告位-内容正文底部

相关文章

您是本站第344314名访客 今日有89篇新文章/评论