网站首页 > 技术文章 正文
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";
<List
height={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-import 或 unplugin-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):检查内存泄漏、渲染瓶颈。
总结建议(针对你做的性能平台项目):
- 表格 / 列表页面 → 用 react-window 做虚拟滚动。
- 路由层 → React.lazy 懒加载页面,避免首页加载过大。
- 数据计算(统计 / 过滤) → 用 useMemo 缓存。
- 表格操作按钮 → 用 React.memo 包裹,减少子组件重复渲染。
- ECharts 图表 → 按需 import(只加载需要的图表类型)。
猜你喜欢
- 2025-09-18 react的filber架构_react的架构原理
- 2025-09-18 大厂都在用 @tanstack/react-query
- 2025-09-18 Vue和React迎来大融合!开发效率大提升
- 2025-09-18 七爪源码:如何在 React 中删除元素 OnClick
- 2025-09-18 通过番计时器实例学习 React 生命周期函数 componentDidMount
- 2025-09-18 React组件渲染优化:掌握key prop的3个实战技巧
- 2025-09-18 我找到了 Compiler 在低版本中使用的方法,它不再是 React 19 的专属
- 2025-09-18 JavaScript Proxy与Reflect实战经验顿悟
- 2025-09-18 React在开发中的常用结构以及功能详解
- 2025-09-18 2025开发React+Flask全栈应用最佳实践:10万+开发者验证终极指南
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)