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.pswp.cn/bicheng/95107.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95107.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95107.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云OpenCloudOS 9系统部署OpenTenBase数据库详细教程

OpenTenBase简介OpenTenBase是一个关系型数据库集群平台&#xff0c;提供写入可靠性和多节点数据同步功能。可以在一台或多台主机上配置OpenTenBase&#xff0c;并将数据存储在多个物理主机上。OpenTenBase架构组件&#xff1a;Coordinator Node (CN)&#xff1a;应用程序访问入…

【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要

目标检测和实例分割是计算机视觉的基本任务。目标检测的传统方法中通常利用边界框技术进行对象定位&#xff0c;然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时&#xff0c;或者在每个图像的对象数量不同的情况下&#xff0c;这些方法通常会出现问题…

C++之stack类的代码及其逻辑详解

1. stack介绍及使用方法stack是一种后进先出的数据结构&#xff0c;所以在C的STL库中也同样遵循了这一点&#xff0c;我们在使用的时候不支持随机访问或迭代器遍历。注意事项调用 top() 或 pop() 前需确保栈非空&#xff0c;否则可能引发未定义行为。stack 没有 clear() 函数&a…

Spring Cache实现简化缓存功能开发

一. 介绍Spring Cache 是 Spring 框架提供的缓存抽象层&#xff0c;它简化了在应用中添加缓存功能的开发工作。通过 Spring Cache&#xff0c;开发者无需关注具体缓存实现的细节&#xff0c;只需通过注解就能快速实现方法级别的缓存管理。核心特点1. 与具体缓存实现解耦&#x…

Lombok(简化Java当中的开发)

Lombok概述 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString/构造方法;打印日志;I/O流的关闭操作等等,这些代码既没有技术含量,又影响着代码的美观,Lombok应运而生。 LomBok可以通过注解,帮助开发人员消除JAVA中尤其是POJO类中的冗长代码。 使…

【DeepSeek】公司内网部署离线deepseek+docker+ragflow本地模型实战

企业内部可能有些数据比较敏感&#xff0c;不能连接互联网。本次实验操作是将deepseek完全离线后迁移至内网使用&#xff0c;实验基于Windows server 2022 datacenter系统安装deepseek、docker、ragflow。 目录使用VMware新建WIN2022虚拟机一、安装DeepSeek模型二.安装Docker使…

【软考架构】面向服务的体系结构(SOA)深度解析

面向服务的体系结构&#xff08;SOA&#xff09;深度解析 面向服务的体系结构&#xff08;Service-Oriented Architecture, SOA&#xff09;是一种以服务为核心的软件架构范式&#xff0c;通过标准化接口实现异构系统间的高效集成与协作。以下从概念定义、发展脉络、技术演进、…

centos7中MySQL 5.7.32 到 5.7.44 升级指南:基于官方二进制包的原地替换式升级

目录前言1. 升级概述1.1 升级背景1.2 升级目的1.3 升级方法概述1.4 升级策略与注意事项2. 升级准备2.1 备份工作2.2 下载目标版本2.3 停止 MySQL 服务3. 替换二进制文件3.1 解压官方二进制包3.2 替换核心二进制文件3.3 更新共享库4. 执行升级并验证4.1 启动 MySQL 服务4.2 监控…

数学七夕花礼(MATLAB版)

前言参考的视频在抖音&#xff0c;电脑版的抖音一直登录不了&#xff0c;用手机分享的链接如下所示。4.35 Iv.FH yTl:/ 04/04 复制打开抖音&#x1f440;数学送的七夕花礼&#xff0c;记得查收噢.# 七夕花礼请查收 ... https://v.douyin.com/H-YpOJCyQyg/rho4sin(8theta)公式&a…

LeetCode - 21. 合并两个有序链表

题目 21. 合并两个有序链表 思路 我会采用双指针的方法&#xff0c;同时遍历两个链表&#xff0c;比较当前节点的值&#xff0c;将较小的节点添加到结果链表中。 具体思路是这样的&#xff1a; 首先创建一个哑节点(dummy node)作为合并后链表的头部&#xff0c;这样可以简…

ES01-环境安装

ES01-环境安装 文章目录ES01-环境安装1-参考网址2-知识总结1-参考网址 elasticsearch官网地址&#xff1a;https://www.elastic.co/安装elasticsearch9.0.0参考&#xff1a;https://zhuanlan.zhihu.com/p/1920780524991017021安装elasticsearch9.0.0参考&#xff1a;http://ww…

UI前端大数据可视化实战策略:如何设计符合用户认知的数据可视化界面?

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!UI前端大数据可视化实战策略&#xff1a;如何设计符合用户认知的数据可视化界面&#xff1f;数…

学习python第15天

其实前面学的根本不记得了&#xff0c;小丑.jpg&#xff0c;如果真的面试问到了估计也是一脸懵今日任务&#xff1a;JSON先认识一下JSON和JSONL文件记得之前在面试KIMI的时候&#xff0c;面试官就给我出了JSONL和EXCEL转换的手撕代码题&#xff0c;而那个时候&#xff0c;我连什…

Spring框架集成Kakfa的方式

Spring框架集成Kakfa的方式 springboot集成kafka的方式 添加maven依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency&g…

【蓝桥杯 2024 省 Python B】缴纳过路费

【蓝桥杯 2024 省 Python B】缴纳过路费 蓝桥杯专栏&#xff1a;2024 省 Python B 算法竞赛&#xff1a;图论&#xff0c;生成树&#xff0c;并查集&#xff0c;组合计数&#xff0c;kruskal 最小生成树&#xff0c;乘法原理 题目链接&#xff1a;洛谷 【蓝桥杯 2024 省 Python…

个性化导航新体验:cpolar让Dashy支持语音控制

文章目录简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问用 cpolar 让 Dashy 管理个人导航站就是这么简单&#xff01;三步轻松搞定&#xff1a;在电脑上安装 Dashy&#xff0c;拖拽添加常用网站&#xff0c;运行 cpolar 生成远程访问链接。这个方法不仅免费&…

SQL学习记录

基本的&#xff0c;增、删&#xff0c;改insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)Delete from 表 where keyvalueupdate 表 set keyvalue,keyvalue where keyvalue查用的最多whereSELECT prod_name, prod_price FROM Products WHERE vend idDLLO1OR ve…

零基础学C++,函数篇~

C基础学习&#xff08;DAY_06&#xff09;函数1. 函数的定义与使用2. 函数参数传递3. 变量的声明周期4. 函数的其他特性5. 函数的嵌套与递归函数 1. 函数的定义与使用 ​ 在设计程序时&#xff0c;如果一段代码重复进行某种操作或者完成一个特定的功能&#xff0c;就应该将这…

react+vite+ts 组件模板

1.创建项目npm create vitelatest my-app --template react-ts2.配置项目 tsconfig.json{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "D…

C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region

C语言中的输出参数详解&#xff1a;以 alloc_chrdev_region 为例 在学习 C 语言函数调用时&#xff0c;我们常常接触到“输入参数”&#xff0c;比如把一个数字传给函数&#xff0c;让函数帮我们算出结果。但有时候可能会发现&#xff0c;有些函数除了返回值之外&#xff0c;还…