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(只加载需要的图表类型)。

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__3 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.4 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~5 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子8 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端