React 与 Next.js 性能优化指南,源自 Vercel 工程团队。适用于编写、审查或重构 React/Next.js 代码时使用。
Vercel React Best Practy.是一项面向实际任务的技能,主要用于React and Next.js 应用程序综合性能优化指南,由Vercel维护. 包含跨8类的62条规则,按影响排序。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
由 Vercel 维护的 React 与 Next.js 应用综合性能优化指南。涵盖 8 个类别共 62 条规则,并按影响程度排序,以指导自动化重构与代码生成。
在以下情况下参考本指南:
| 优先级 | 类别 | 影响程度 | 前缀 |
|---|---|---|---|
| 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 性能(JavaScript Performance) | LOW-MEDIUM | js- |
| 8 | 高级模式(Advanced Patterns) | LOW | advanced- |
async-defer-await — 将 await 移至实际使用它的分支中async-parallel — 对独立操作使用 Promise.all()async-dependencies — 使用 better-all 处理部分依赖关系async-api-routes — 在 API 路由中尽早启动 Promise,延迟 awaitasync-suspense-boundaries — 使用 Suspense 流式传输内容bundle-barrel-imports — 直接导入,避免使用 barrel 文件bundle-dynamic-imports — 对重型组件使用 next/dynamicbundle-defer-third-party — 在 hydration 完成后加载分析/日志工具bundle-conditional — 仅在功能启用时加载对应模块bundle-preload — 在悬停/聚焦时预加载,提升感知速度server-auth-actions — 像处理 API 路由一样对服务端操作进行身份验证server-cache-react — 使用 React.cache() 实现按请求去重server-cache-lru — 使用 LRU 缓存实现跨请求缓存server-dedup-props — 避免在 RSC props 中重复序列化数据server-hoist-static-io — 将静态 I/O(如字体、Logo)提升至模块层级server-serialization — 最小化传递给客户端组件的数据量server-parallel-fetching — 重构组件结构以并行执行 fetch 请求server-after-nonblocking — 使用 after() 执行非阻塞操作client-swr-dedup — 使用 SWR 实现自动请求去重client-event-listeners — 去重全局事件监听器client-passive-event-listeners — 对滚动事件使用 passive 监听器client-localstorage-schema — 对 localStorage 数据进行版本控制并最小化其体积rerender-defer-reads — 不要订阅仅在回调中使用的状态rerender-memo — 将耗时逻辑提取为 memoized 组件rerender-memo-with-default-value — 将默认的非原始类型 props 提升至外层作用域rerender-dependencies — 在 effect 中使用原始类型作为依赖项rerender-derived-state — 订阅派生布尔值,而非原始值rerender-derived-state-no-effect — 在渲染过程中派生状态,而非在 effect 中rerender-functional-setstate — 使用函数式 setState 保证回调稳定性rerender-lazy-state-init — 向 useState 传入函数以延迟计算昂贵初始值rerender-simple-expression-in-memo — 避免对简单原始值使用 memorerender-move-effect-to-event — 将交互逻辑移至事件处理器中rerender-transitions — 对非紧急更新使用 startTransitionrerender-use-ref-transient-values — 对频繁变化的临时值使用 refrerender-no-inline-components — 不要在组件内部定义组件rendering-animate-svg-wrapper — 动画作用于 div 包裹器,而非 SVG 元素本身rendering-content-visibility — 对长列表使用 content-visibilityrendering-hoist-jsx — 将静态 JSX 提取到组件外部rendering-svg-precision — 降低 SVG 坐标精度rendering-hydration-no-flicker — 使用内联脚本提供仅客户端数据,防止闪烁rendering-hydration-suppress-warning — 抑制预期的 hydration 差异警告rendering-activity — 使用 Activity 组件控制显示/隐藏rendering-conditional-render — 使用三元表达式而非 && 进行条件渲染rendering-usetransition-loading — 优先使用 useTransition 管理加载状态rendering-resource-hints — 使用 React DOM 的资源提示(resource hints)进行预加载rendering-script-defer-async — 在 标签上使用 defer 或 asyncjs-batch-dom-css — 通过 CSS 类或 cssText 批量修改样式js-index-maps — 为高频查找构建 Mapjs-cache-property-access — 在循环中缓存对象属性访问js-cache-function-results — 在模块级 Map 中缓存函数结果js-cache-storage — 缓存对 localStorage/sessionStorage 的读取js-combine-iterations — 将多个 filter/map 合并为单次遍历js-length-check-first — 在执行高开销比较前先检查数组长度js-early-exit — 函数尽早返回js-hoist-regexp — 将正则表达式创建提升至循环外部js-min-max-loop — 使用循环而非 sort 计算最小/最大值js-set-map-lookups — 使用 Set/Map 实现 O(1) 查找js-tosorted-immutable — 使用 toSorted() 保证不可变性js-flatmap-filter — 使用 flatMap 在一次遍历中完成映射与过滤advanced-event-handler-refs — 将事件处理器存储在 ref 中advanced-init-once — 每次应用加载仅初始化一次advanced-use-latest — 使用 useLatest 获取稳定的回调引用阅读各条规则对应的文档文件,获取详细说明与代码示例:
rules/async-parallel.md rules/bundle-barrel-imports.md
每条规则文档包含以下内容:
如需查看所有规则展开后的完整指南,请参阅:AGENTS.md