react性能优化有哪些

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


🔹 一、渲染性能优化

1. 减少不必要的渲染

  • React.memo:对函数组件做浅比较,避免相同 props 时重复渲染。
  • useMemo / useCallback:缓存计算结果或函数引用,减少子组件 re-render。
  • PureComponent (class 组件):类似 React.memo,内置浅比较。
javascript 复制代码
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:只渲染可视区域,提高长列表性能。
javascript 复制代码
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-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(只加载需要的图表类型)。

相关推荐
xdl25992 分钟前
CSS flex 布局中没有 justify-items
前端·css
百撕可乐2 分钟前
WenDoraAi官网NextJS实战04:HTTP 请求封装与SSR
前端·网络·网络协议·react.js·http
Sestid4 分钟前
前端AI编程使用技巧(后续会更新cursor和claude code for vscode)
前端·vscode·ai编程·claude·cursor
freeWayWalker7 分钟前
Vue通用缩放容器
前端·javascript·vue.js
Hello--_--World15 分钟前
VUE:逻辑复用
前端·javascript·vue.js
陶甜也31 分钟前
3D智慧城市:blender建模、骨骼、动画、VUE、threeJs引入渲染,飞行视角,涟漪、人物行走
前端·3d·vue·blender·threejs·模型
患得患失94937 分钟前
【前端websocket】企业级功能清单
前端·websocket·网络协议
落魄江湖行37 分钟前
基础篇四 Nuxt4 全局样式与 CSS 模块
前端·css·typescript·nuxt4
禅思院38 分钟前
前端性能优化:从"术"到"道"的完整修炼指南
前端·架构·前端框架