当前位置: 首页 > web >正文

react性能优化有哪些

React 性能优化的手段比较多,既有代码层面的,也有构建层面的,还涉及到运行时调优。我帮你系统性梳理一份:


🔹 一、渲染性能优化

1. 减少不必要的渲染

  • React.memo:对函数组件做浅比较,避免相同 props 时重复渲染。

  • useMemo / useCallback:缓存计算结果或函数引用,减少子组件 re-render。

  • PureComponent(class 组件):类似 React.memo,内置浅比较。

const Child = React.memo(({ value }: { value: number }) => {console.log("render child");return <div>{value}</div>;
});function App() {const [count, setCount] = useState(0);return <Child value={count} />;
}

2. 合理使用 key

  • key 决定 React Diff 算法的复用策略,避免用 index 作为 key,优先使用唯一 id。


3. 虚拟化长列表

  • react-window / react-virtualized:只渲染可视区域,提高长列表性能。

import { FixedSizeList as List } from "react-window";<Listheight={400}itemCount={1000}itemSize={35}width={300}
>{({ index, style }) => <div style={style}>Row {index}</div>}
</List>

4. 避免在渲染时做重计算

  • 不要在 JSX 里直接做大计算 / map / sort,使用 useMemo 缓存结果。


5. 减少 Context 过度渲染

  • Context 更新会触发所有消费组件刷新。

  • 优化手段:

    • 拆分 Context

    • 或配合 selector hook(比如 use-context-selector


🔹 二、构建与加载优化

1. 代码分割

  • React.lazy + Suspense 路由级别拆分。

  • dynamic import() 工具函数/图表库等按需加载。

2. Tree Shaking

  • 确保打包工具能清除无用代码(Webpack、Vite 默认支持 ES Module)。

3. 压缩与缓存

  • 使用 gzip 或 brotli 压缩。

  • 配置浏览器缓存策略(静态资源 hash 命名)。

4. 使用 CDN / 按需加载依赖

  • 比如 antd 用 babel-plugin-importunplugin-import 按需引入。


🔹 三、运行时优化

1. 避免频繁状态更新

  • 合并 setState

  • 使用 批量更新(React 18 自动启用)

2. 合理选择状态存储位置

  • 不要把所有状态放在全局(Redux/Context)。

  • 局部状态用 useState 更高效。

3. 使用 Web Worker

  • 把耗时计算移到 Worker,避免阻塞主线程。

4. 节流与防抖

  • 对滚动、输入等高频事件处理函数加上 debounce/throttle


🔹 四、UI & 交互优化

1. 图片优化

  • 懒加载(<img loading="lazy" />)。

  • 使用合适的格式(WebP、AVIF)。

2. 骨架屏 / 占位符

  • 提升用户感知性能,避免白屏。

3. Suspense + Streaming SSR

  • React 18 支持流式渲染,首屏更快。


🔹 五、开发阶段调优工具

  • React Profiler:分析组件渲染耗时。

  • why-did-you-render:检测不必要的 re-render。

  • Performance 面板(Chrome DevTools):检查内存泄漏、渲染瓶颈。


📌 总结建议(针对你做的性能平台项目):

  1. 表格 / 列表页面 → 用 react-window 做虚拟滚动。

  2. 路由层React.lazy 懒加载页面,避免首页加载过大。

  3. 数据计算(统计 / 过滤) → 用 useMemo 缓存。

  4. 表格操作按钮 → 用 React.memo 包裹,减少子组件重复渲染。

  5. ECharts 图表 → 按需 import(只加载需要的图表类型)。


http://www.xdnf.cn/news/19397.html

相关文章:

  • SSR降级CSR:高可用容灾方案详解
  • Android中handler机制
  • 【Android】JSONObject和Gson的使用
  • HTTP的概念、原理、工作机制、数据格式和REST
  • 《C++——makefile》
  • 三重积分的性质
  • 【MATLAB绘图进阶教程】(2-6)动态绘图制作详解与例程,包括drawnow、pause、getframe、video write等命令
  • 机器学习时间序列算法进行随机划分数据是不合适的!
  • Dify1.8.0最新版本安装教程:Ubuntu25.04系统本地化安装部署Dify详细教程
  • 移动零,leetCode热题100,C++实现
  • IP-Guard支持修改安全区域密级文字和密级级数
  • 嵌入式学习日记(38)HTTP
  • Java学习笔记-多线程基础
  • Kafka 4.0 生产者配置全解析与实战调优
  • Go语言流式输出实战:构建高性能实时应用
  • 数据结构(力扣刷题)
  • 蜂窝通信模组OpenCPU的介绍
  • REST-assured获取响应数据详解
  • 手写链路追踪优化-自动全局追踪代替局部手动追踪
  • 做一个实用的节假日工具
  • Java面试-spring boot框架
  • 98、23种设计模式之代理模式(7/23)
  • 【SpringMVC】SSM框架【二】——SpringMVC超详细
  • ModuleNotFoundError: No module named ‘cairosvg‘
  • 浔川社团阅读量破历史记录
  • 得物25年春招-安卓部分编程题
  • GD32入门到实战21--输入捕获
  • 【C++】日期类实现详解:代码解析与复用优化
  • C#正则表达式与用法
  • 【基础-单选】关于Tabs组件页签的位置设置,下面描述错误的是