mcpField
R
react-best-practices

react-best-practices

github.com/akillness开发53399 次安装1 天前更新
代码仓库

关于 react-best-practices

react-best-practices 是面向 React 和 Next.js 开发及代码审查的性能指导技能。它先按主要瓶颈分类,再提供测量建议和分层规则,优先处理异步瀑布、包体积与服务端性能问题。

主要功能

  1. 01按性能瓶颈分类
  2. 02减少异步瀑布
  3. 03优化包体积与加载
  4. 04指导服务端性能改进
  5. 05提供测量与工具清单

适用场景

  1. 01排查页面加载缓慢
  2. 02审查 React 性能问题
  3. 03优化 Next.js 路由包体积
  4. 04评估重渲染与水合开销

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/akillness/jeo-skills --skill react-best-practices

安装后在 Claude Code 中输入/react-best-practices确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

AGENTS.md
SKILL.toon
evals/
evals.json
references/
boundaries-and-route-outs.md
measurement-and-tooling-checklist.md
perf-triage-modes.md

详细介绍

Vercel React 最佳实践

以测量为导向的 React 和 Next.js 性能技能,用于在重构前将慢页面问题分流到合适的资料包。重点关注瀑布流、包体积、RSC 或客户端边界错误、Hydration/脚本开销以及重复渲染;完整的 AGENTS.md 仍可查阅,但日常使用应从较轻量的参考资料包和分流指南开始。

何时使用此技能

在以下情况下参考这些指南:

  • 编写新的 React 组件或 Next.js 页面
  • 实现数据获取(客户端或服务端)
  • 检查代码中的性能问题
  • 重构现有 React/Next.js 代码
  • 优化包体积或加载时间

按优先级划分的规则类别

优先级类别影响前缀
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() 并行执行独立操作
  • async-dependencies - 使用 better-all 处理部分依赖
  • async-api-routes - 在 API 路由中尽早启动 Promise,延后 await
  • async-suspense-boundaries - 使用 Suspense 流式传输内容
2. 包体积优化(严重)
  • bundle-barrel-imports - 直接导入,避免使用聚合导出文件
  • bundle-dynamic-imports - 对大型组件使用 next/dynamic
  • bundle-defer-third-party - 在 Hydration 后加载分析/日志工具
  • bundle-conditional - 仅在功能启用时加载模块
  • bundle-preload - 在悬停/聚焦时预加载,提升感知速度
3. 服务端性能(高)
  • server-cache-react - 使用 React.cache() 在每个请求内去重
  • server-cache-lru - 使用 LRU 缓存跨请求复用结果
  • server-serialization - 尽量减少传递给客户端组件的数据
  • server-parallel-fetching - 重构组件以并行获取数据
  • server-after-nonblocking - 使用 after() 执行非阻塞操作
4. 客户端数据获取(中高)
  • client-swr-dedup - 使用 SWR 自动对请求去重
  • client-event-listeners - 对全局事件监听器去重
5. 重复渲染优化(中)
  • rerender-defer-reads - 不要订阅仅在回调中使用的状态
  • rerender-memo - 将耗时操作提取到经过记忆化的组件中
  • rerender-dependencies - 在 effects 中使用原始类型依赖项
  • rerender-derived-state - 订阅派生布尔值,而非原始值
  • rerender-functional-setstate - 使用函数式 setState 保持回调稳定
  • rerender-lazy-state-init - 对耗时值,将函数传给 useState
  • rerender-transitions - 对非紧急更新使用 startTransition
6. 渲染性能(中)
  • rendering-animate-svg-wrapper - 为 div 包装元素添加动画,而非 SVG 元素
  • rendering-content-visibility - 对长列表使用 content-visibility
  • rendering-hoist-jsx - 将静态 JSX 提取到组件外部
  • rendering-svg-precision - 降低 SVG 坐标精度
  • rendering-hydration-no-flicker - 使用内联脚本处理仅客户端数据
  • rendering-activity - 使用 Activity 组件控制显示/隐藏
  • rendering-conditional-render - 条件渲染使用三元表达式,而非 &&
7. JavaScript 性能(低至中)
  • js-batch-dom-css - 通过类或 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. 高级模式(低)
  • advanced-event-handler-refs - 在 refs 中存储事件处理函数
  • advanced-use-latest - 使用 useLatest 实现稳定的回调 ref

说明

第 1 步:提出修复建议前,先对主要瓶颈分类

从 references/perf-triage-modes.md 开始,并将任务归入一个主要类别:

  • 瀑布式调用 / 异步顺序执行
  • 包体积 / 延迟加载
  • RSC / 服务端与客户端边界错误
  • 重渲染过多 / 记忆化 / 上下文扩散
  • 水合或第三方脚本开销
  • 优先测量的未知问题
第 2 步:选择能解答问题的最小支持资料包
  • references/perf-triage-modes.md — 选择主要的 React / Next.js 性能模式及首批修复措施
  • references/measurement-and-tooling-checklist.md — 决定使用 React Profiler、包分析器、Web Vitals 还是 PR 预算工具进行测量
  • references/boundaries-and-route-outs.md — 明确与 state-management、web-accessibility、responsive-design 和 performance-optimization 的职责边界
  • AGENTS.md — 当代码生成或大规模重构需要完整的 45 条规则参考时,查阅完整规则目录
第 3 步:优先采用以测量为依据的修复,而不是盲目照搬

建议进行大范围记忆化或大量使用缓存的重写前,先使用测量清单。React Compiler、包分析器和 Web Vitals 埋点的变化,已经影响了哪些旧有 React 性能经验仍值得盲目套用。

第 4 步:优先处理影响最大的修复
  1. 消除瀑布式调用和启动过晚的异步工作。
  2. 缩减路由 JS 和庞大的客户端边界。
  3. 修正水合或脚本放置错误。
  4. 在了解更大的加载和边界开销后,再处理重渲染过多的问题。
第 5 步:将相邻领域的工作转交出去,不要一概揽下
  • 应用级状态模型的选择 → ../state-management/SKILL.md
  • 无障碍相关问题 → ../web-accessibility/SKILL.md
  • 布局适配 / 溢出 / 重排问题 → ../responsive-design/SKILL.md
  • 非 React 或跨技术栈的瓶颈 → ../performance-optimization/SKILL.md

示例

使用 Promise.all 执行相互独立的操作(关键)
// ❌ Sequential: 3 round trips
const user = await fetchUser()
const posts = await fetchPosts()
const comments = await fetchComments()

// ✅ Parallel: 1 round trip
const [user, posts, comments] = await Promise.all([
  fetchUser(),
  fetchPosts(),
  fetchComments()
])
避免从 Barrel 文件导入(关键)
// ❌ Imports entire library (200-800ms import cost)
import { Check, X, Menu } from 'lucide-react'

// ✅ Imports only what you need
import Check from 'lucide-react/dist/esm/icons/check'
import X from 'lucide-react/dist/esm/icons/x'
对大型组件使用动态导入(关键)
// ❌ Monaco bundles with main chunk ~300KB
import { MonacoEditor } from './monaco-editor'

// ✅ Monaco loads on demand
import dynamic from 'next/dynamic'
const MonacoEditor = dynamic(
  () => import('./monaco-editor').then(m => m.MonacoEditor),
  { ssr: false }
)
使用函数式 setState(中)
// ❌ Requires state as dependency, stale closure risk
const addItems = useCallback((newItems) => {
  setItems([...items, ...newItems])
}, [items])

// ✅ Stable callback, no stale closures
const addItems = useCallback((newItems) => {
  setItems(curr => [...curr, ...newItems])
}, [])

最佳实践

  1. 从与问题匹配的最精简支持资料开始;只有在较小范围的参考资料不足以解决问题时才使用 AGENTS.md。
  2. 优先采用以证据为依据的修复方案:在建议使用记忆化或缓存之前,应先参考 React Profiler、打包分析器和 Web Vitals 的结果。
  3. 将 React Compiler 视为会影响过时记忆化经验法则的现实约束;不要默认“把所有东西都包在 memo 里”。
  4. 将 React 专属建议与更广泛的前端问题分开:使用 state-management 选择全应用状态管理方案,使用 web-accessibility 修复 WCAG 问题,使用 performance-optimization 处理非 React 全局瓶颈。
  5. 只有在现有工作流明确要求使用该确切名称时,才使用兼容性别名 vercel-react-best-practices。
  6. 面向团队实际使用时,应考虑 PR 预算和包体积差异工作流;此技能应支持运维审计,而不只是代码级微调。

约束

必须遵守的规则(MUST)
  1. 消除瀑布流:使用 Promise.all、Suspense
  2. 优化打包体积:禁止使用 barrel imports,使用动态导入
  3. RSC 边界:仅序列化所需的数据
禁止事项(MUST NOT)
  1. 顺序 await:不要按顺序执行彼此独立的获取操作
  2. 修改数组:使用 toSorted() 代替 sort()
  3. 在 React.cache 中使用内联对象:这会导致缓存未命中

参考资料

元数据

版本
  • 当前版本:1.1.0
  • 最后更新:2026-04-16
  • 支持的平台:Claude、ChatGPT、Gemini
  • 来源:vercel/agent-skills
相关技能
标签

#React #Next.js #performance #optimization #vercel #waterfalls #bundle-size #RSC #frontend

评论

支持 Markdown