React Performance

Polar Sponsor
爱发电 赞助
.NET 9.0

React 与 Next.js 性能优化模式。适用于编写、审查或重构代码以确保最佳性能。涉及组件、数据获取、构建包优化、减少重渲染或服务端组件架构时触发。

反应性能模式

功能概述

反应性能模式是一项面向实际任务的技能,主要用于React and Next.js 应用程序的性能优化指南;Patterns. scross 7 类, 按效果排列;

核心要点

  • 详细示例在引用 /.;
  • When to Application。
  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

使用与执行

使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

React 性能优化模式

面向 React 和 Next.js 应用的性能优化指南。涵盖 7 类优化模式,按影响程度排序。详细示例见 references/ 目录。

适用场景

  • 编写新的 React 组件或 Next.js 页面时
  • 实现数据获取(客户端或服务端)时
  • 进行性能审查或重构时
  • 优化包体积或加载时间时

按优先级划分的类别

# 类别 影响程度
1 Async / Waterfalls CRITICAL
2 Bundle Size CRITICAL
3 Server Components HIGH
4 Re-renders MEDIUM
5 Rendering MEDIUM
6 Client-Side Data MEDIUM
7 JS Performance LOW-MEDIUM

安装方式

OpenClaw / Moltbot / Clawbot

npx clawhub@latest install react-performance

1. Async — 消除瀑布式请求(CRITICAL)

并行执行相互独立的操作

顺序 await 是 React 应用中最大的性能失误。

// BAD — 串行,需 3 次网络往返
const user = await fetchUser()
const posts = await fetchPosts()
const comments = await fetchComments()

// GOOD — 并行,仅需 1 次网络往返
const [user, posts, comments] = await Promise.all([
  fetchUser(), fetchPosts(), fetchComments(),
])

延迟 await 至真正需要时再执行

await 移至实际使用该值的分支内。

// BAD — 两个分支均被阻塞
async function handle(userId: string, skip: boolean) {
  const data = await fetchUserData(userId)
  if (skip) return { skipped: true }    // 即使跳过仍会等待
  return process(data)
}

// GOOD — 仅在必要时阻塞
async function handle(userId: string, skip: boolean) {
  if (skip) return { skipped: true }    // 立即返回
  return process(await fetchUserData(userId))
}

策略性地设置 Suspense 边界

立即渲染布局,同时让依赖数据的区域独立加载。

// BAD — 整个页面被阻塞
async function Page() {
  const data = await fetchData()
  return 
} // GOOD — 布局立即渲染,数据流式加载 function Page() { return (
}>
) } async function DataDisplay() { const data = await fetchData() return
{data.content}
}

使用 use() 在组件间共享同一个 Promise,避免重复请求。

2. 包体积优化(CRITICAL)

避免使用 barrel 文件导入

barrel 文件会加载数千个未使用的模块。直接导入可节省 200–800ms。

// BAD — 加载 1583 个模块
import { Check, X, Menu } from 'lucide-react'

// GOOD — 仅加载 3 个模块
import Check from 'lucide-react/dist/esm/icons/check'
import X from 'lucide-react/dist/esm/icons/x'
import Menu from 'lucide-react/dist/esm/icons/menu'

Next.js 13.5+:在配置中启用 experimental.optimizePackageImports。 常见受影响库:lucide-react@mui/materialreact-icons@radix-uilodashdate-fns

对重型组件使用动态导入

import dynamic from 'next/dynamic'
const MonacoEditor = dynamic(
  () => import('./monaco-editor').then((m) => m.MonacoEditor),
  { ssr: false }
)

延迟加载非关键第三方库

分析、日志、错误追踪等 —— 使用 dynamic() 配合 { ssr: false } 在 hydration 后加载。

基于用户意图预加载

const preload = () => { void import('./monaco-editor') }

3. Server Components(HIGH)

最小化 RSC 边界处的序列化开销

仅向客户端传递其实际使用的字段。

// BAD — 序列化全部 50 个用户字段
return 

// GOOD — 仅序列化 1 个字段
return 

通过组合实现并行数据获取

RSC 在组件树内按顺序执行。需重构结构以支持并行。

// BAD — Sidebar 等待 header 请求完成
export default async function Page() {
  const header = await fetchHeader()
  return 
{header}
} // GOOD — 同级异步组件同时发起请求 async function Header() { return
{await fetchHeader()}
} async function Sidebar() { return } export default function Page() { return
}

使用 React.cache() 实现按请求去重

import { cache } from 'react'
export const getCurrentUser = cache(async () => {
  const session = await auth()
  if (!session?.user?.id) return null
  return await db.user.findUnique({ where: { id: session.user.id } })
})

请使用基础类型参数(而非内联对象)—— React.cache() 内部使用 Object.is 进行比对。 Next.js 会自动对 fetch 调用去重,但数据库查询、鉴权检查及计算类逻辑仍需显式使用 React.cache()

使用 after() 执行非阻塞操作

import { after } from 'next/server'
export async function POST(request: Request) {
  await updateDatabase(request)
  after(async () => { logUserAction({ userAgent: request.headers.get('user-agent') }) })
  return Response.json({ status: 'success' })
}

4. 重渲染优化(MEDIUM)

在渲染过程中派生状态 —— 而非在 effect 中

// BAD — 多余的状态 + effect
const [fullName, setFullName] = useState('')
useEffect(() => { setFullName(first + ' ' + last) }, [first, last])

// GOOD — 渲染时内联派生
const fullName = first + ' ' + last

使用函数式 setState 保证回调稳定性

// BAD — 每次 items 变更都会重新创建
const addItem = useCallback((item: Item) => {
  setItems([...items, item])
}, [items])

// GOOD — 回调稳定,始终获取最新状态
const addItem = useCallback((item: Item) => {
  setItems((curr) => [...curr, item])
}, [])

将状态读取延迟到实际使用点

若仅在回调中读取状态,则无需订阅动态状态。

// BAD — 每次 searchParams 变更都触发重渲染
const searchParams = useSearchParams()
const handleShare = () => shareChat(chatId, { ref: searchParams.get('ref') })

// GOOD — 按需读取
const handleShare = () => {
  const ref = new URLSearchParams(window.location.search).get('ref')
  shareChat(chatId, { ref })
}

惰性初始化状态

// BAD — 每次渲染都执行 JSON.parse
const [settings] = useState(JSON.parse(localStorage.getItem('s') || '{}'))

// GOOD — 仅执行一次
const [settings] = useState(() => JSON.parse(localStorage.getItem('s') || '{}'))

订阅派生布尔值

// BAD — 每像素变化都触发重渲染
const width = useWindowWidth(); const isMobile = width < 768

// GOOD — 仅当布尔值翻转时重渲染
const isMobile = useMediaQuery('(max-width: 767px)')

对非紧急更新使用 Transition

// BAD — 滚动时阻塞 UI
const handler = () => setScrollY(window.scrollY)

// GOOD — 非阻塞
const handler = () => startTransition(() => setScrollY(window.scrollY))

将耗时逻辑提取为 memoized 组件

const UserAvatar = memo(function UserAvatar({ user }: { user: User }) {
  const id = useMemo(() => computeAvatarId(user), [user])
  return 
})
function Profile({ user, loading }: Props) {
  if (loading) return 
  return 
}

注意:React Compiler 可自动处理,无需手动添加 memo()/useMemo()

5. 渲染性能(MEDIUM)

对长列表使用 CSS content-visibility

对于含 1000 条目的列表,浏览器可跳过约 990 条屏幕外条目(首屏渲染快约 10 倍)。

.list-item { content-visibility: auto; contain-intrinsic-size: 0 80px; }

将静态 JSX 提升至组件外部

避免重复创建,尤其适用于大型 SVG 节点。React Compiler 会自动执行此优化。

const skeleton = 
function Container() { return
{loading && skeleton}
}

6. 客户端数据(MEDIUM)

使用 SWR 实现去重与缓存

// BAD — 每个实例独立发起请求
useEffect(() => { fetch('/api/users').then(r => r.json()).then(setUsers) }, [])

// GOOD — 多个实例共享单次请求
const { data: users } = useSWR('/api/users', fetcher)

7. JavaScript 性能(LOW-MEDIUM)

使用 Set / Map 实现 O(1) 查找

// BAD — O(n)
items.filter(i => allowed.includes(i.id))
// GOOD — O(1)
const allowedSet = new Set(allowed)
items.filter(i => allowedSet.has(i.id))

合并数组遍历操作

// BAD — 3 次遍历
const a = users.filter(u => u.isAdmin)
const t = users.filter(u => u.isTester)
// GOOD — 1 次遍历
const a: User[] = [], t: User[] = []
for (const u of users) { if (u.isAdmin) a.push(u); if (u.isTester) t.push(u) }

其他建议:尽早返回、在循环中缓存属性访问、将 RegExp 提升至循环外、热路径优先选用 for...of

快速决策指南

  1. 页面加载缓慢? → 先检查包体积(2),再排查异步瀑布流(1)
  2. 交互卡顿? → 先优化重渲染(4),再关注 JS 性能(7)
  3. 服务端页面响应慢? → 检查 RSC 序列化开销与并行数据获取(3)
  4. 客户端数据陈旧或缓慢? → 使用 SWR(6)
  5. 长列表滚动卡顿? → 启用 content-visibility(5)

相关专题

更多
JavaScript React组件优化与性能提升实战
JavaScript React组件优化与性能提升实战

本专题围绕 React 框架在大型前端项目中的性能优化展开,讲解组件生命周期优化、虚拟 DOM 原理、状态管理策略及懒加载技术。通过实战案例,帮助开发者构建性能优良、响应迅速的前端应用。

2026.04.13

165

18

React 18状态管理与Hooks高级实践
React 18状态管理与Hooks高级实践

本专题专注于 React 18 的高级开发技术,详细讲解 useState、useEffect、useReducer、useContext 等 Hooks 的使用技巧,以及 Redux、Zustand 等状态管理工具的集成与优化方法。通过真实案例,帮助前端开发者构建可维护、性能优良的现代 React 应用。

2026.02.10

183

17

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

0

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

0

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

0

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

0

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

0

27

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

2026.09.11

0

28

GDB怎么查看变量值
GDB怎么查看变量值

本专题介绍GDB调试过程中查看变量值的具体方法,涵盖局部变量、函数参数、数组、结构体和指针内容查询,同时整理变量持续显示、格式化输出及无法读取变量时的排查思路。

2026.09.11

0

22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 11.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习