Vercel React 最佳实践是一份面向 React 与 Next.js 应用的综合性性能优化指南,由 Vercel 维护,共包含 8 个类别下的 57 条规则。这些规则按影响程度排序,用于引导自动化重构与代码生成。
适用时机
在以下情况可参考这些指南:编写新的 React 组件或 Next.js 页面;实现数据获取(客户端或服务端);审查代码中的性能问题;重构现有的 React/Next.js 代码;优化打包体积或加载时间。
规则类别(按优先级)
优先级 1:消除瀑布流(CRITICAL,前缀 async-)。包括:async-defer-await(将 await 移入实际使用的分支)、async-parallel(对独立操作使用 Promise.all())、async-dependencies(对部分依赖使用 better-all)、async-api-routes(在 API 路由中提前启动 promise、延后 await)、async-suspense-boundaries(使用 Suspense 流式输出内容)。
优先级 2:包体积优化(CRITICAL,前缀 bundle-)。包括:bundle-barrel-imports(直接导入,避免 barrel 文件)、bundle-dynamic-imports(对重型组件使用 next/dynamic)、bundle-defer-third-party(在 hydration 之后加载分析/日志)、bundle-conditional(仅在功能激活时加载模块)、bundle-preload(悬停/聚焦时预加载以提升感知速度)。
优先级 3:服务端性能(HIGH,前缀 server-)。包括:server-auth-actions(像 API 路由一样对 server actions 鉴权)、server-cache-react(使用 React.cache() 做单请求去重)、server-cache-lru(使用 LRU 缓存做跨请求缓存)、server-dedup-props(避免 RSC props 中的重复序列化)、server-serialization(最小化传给客户端组件的数据)、server-parallel-fetching(重构组件以并行获取)、server-after-nonblocking(使用 after() 处理非阻塞操作)。
优先级 4:客户端数据获取(MEDIUM-HIGH,前缀 client-)。包括:client-swr-dedup(使用 SWR 自动去重请求)、client-event-listeners(去重全局事件监听器)、client-passive-event-listeners(对滚动使用 passive 监听器)、client-localstorage-schema(对 localStorage 数据做版本化并最小化)。
优先级 5:重渲染优化(MEDIUM,前缀 rerender-)。包括:rerender-defer-reads(不要订阅仅在回调中使用的 state)、rerender-memo(将昂贵工作抽到 memo 化组件)、rerender-memo-with-default-value(提升默认非原始类型 props)、rerender-dependencies(在 effect 中使用原始类型依赖)、rerender-derived-state(订阅派生布尔值而非原始值)、rerender-derived-state-no-effect(在渲染期间派生 state 而非 effect)、rerender-functional-setstate(使用函数式 setState 保证回调稳定)、rerender-lazy-state-init(对昂贵值向 useState 传函数)、rerender-simple-expression-in-memo(避免对简单原始值使用 memo)、rerender-move-effect-to-event(将交互逻辑放入事件处理器)、rerender-transitions(对非紧急更新使用 startTransition)、rerender-use-ref-transient-values(对瞬时高频值使用 refs)。
优先级 6:渲染性能(MEDIUM,前缀 rendering-)。包括:rendering-animate-svg-wrapper(动画作用于 div 包装器而非 SVG 元素)、rendering-content-visibility(对长列表使用 content-visibility)、rendering-hoist-jsx(将静态 JSX 提取到组件外)、rendering-svg-precision(降低 SVG 坐标精度)、rendering-hydration-no-flicker(对纯客户端数据使用内联脚本)、rendering-hydration-suppress-warning(抑制预期的失配警告)、rendering-activity(使用 Activity 组件做显示/隐藏)、rendering-conditional-render(条件渲染用三元而非 &&)、rendering-usetransition-loading(加载状态优先用 useTransition)。
优先级 7:JavaScript 性能(LOW-MEDIUM,前缀 js-)。包括:js-batch-dom-css(通过 class 或 cssText 批量修改 CSS)、js-index-maps(为重复查找构建 Map)、js-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(将 RegExp 创建提升到循环外)、js-min-max-loop(用循环而非排序求最小/最大值)、js-set-map-lookups(使用 Set/Map 做 O(1) 查找)、js-tosorted-immutable(使用 toSorted() 保持不可变)。
优先级 8:高级模式(LOW,前缀 advanced-)。包括:advanced-event-handler-refs(将事件处理器存入 refs)、advanced-init-once(每次应用加载仅初始化一次)、advanced-use-latest(useLatest 用于稳定的回调 refs)。
如何使用
阅读各规则文件可查看详细说明与代码示例,例如 rules/async-parallel.md、rules/bundle-barrel-imports.md。每个规则文件包含:为何重要的简要说明、带说明的错误代码示例、带说明的正确代码示例,以及附加上下文与参考。
完整汇编文档
如需包含所有规则展开内容的完整指南,见 AGENTS.md。