React 项目常见优化方案

对于面试和实际项目来说,React 优化一般分为 渲染优化、打包优化、网络优化、列表优化、状态管理优化 五大类。

结合你做过性能平台、ECharts、后台管理系统的经验,下面这些是最常见且最实用的优化方案。

一、减少不必要的渲染

1. React.memo

适用于:

  • 子组件依赖 props

  • 父组件频繁更新

    const Child = React.memo((props) => {
    return

    ;
    });

避免:

复制代码
Parent重新渲染
↓
Child跟着重新渲染

2. useMemo

缓存计算结果。

错误

复制代码
const list = users.filter(item => item.age > 18);

每次 render 都执行。

优化

复制代码
const list = useMemo(() => {
  return users.filter(item => item.age > 18);
}, [users]);

3. useCallback

缓存函数引用。

错误

复制代码
<Button onClick={() => handleClick()} />

每次 render 创建新函数。

优化

复制代码
const handleClick = useCallback(() => {
  console.log("click");
}, []);

二、大数据列表优化

这是后台系统最容易遇到的问题。

1. 虚拟列表

例如:

复制代码
10000条数据

不要一次渲染。

使用:

实际只渲染可视区域。


2. 分页加载

后台管理系统推荐:

复制代码
每页20条
每页50条

不要直接:

复制代码
一次加载10000条

三、路由懒加载

后台项目经常几十个页面。

普通写法

复制代码
import User from './User';

全部打进首屏。


优化

复制代码
const User = React.lazy(() =>
  import('./User')
);

<Suspense fallback={<Loading />}>
  <User />
</Suspense>

实现:

复制代码
按需加载

四、Webpack/Vite打包优化

1. Tree Shaking

错误:

复制代码
import * as lodash from "lodash";

优化:

复制代码
import debounce from "lodash/debounce";

2. 代码分包

例如:

复制代码
react
antd
echarts

拆分独立 chunk。

Vite:

复制代码
manualChunks:{
  react:['react','react-dom'],
  antd:['antd'],
  echarts:['echarts']
}

3. gzip压缩

服务器开启:

复制代码
gzip
brotli

包体积通常能减少:

复制代码
70%左右

五、图片优化

懒加载

复制代码
<img
 loading="lazy"
 src={url}
/>

WebP

原图:

复制代码
500KB

WebP:

复制代码
100KB

CDN

静态资源走:

  • OSS

  • COS

  • CDN

减少服务器压力。


六、状态管理优化

Redux Selector缓存

错误:

复制代码
const users = store.users.filter(...)

每次 render 计算。


优化:

复制代码
import { createSelector } from "reselect";

const getUsers = createSelector(
  [state => state.users],
  users => users.filter(...)
);

七、ECharts优化(你项目经常会遇到)

你做性能平台应该碰到过。

数据抽样

复制代码
sampling: 'lttb'

progressive

复制代码
progressive: 5000

dataZoom

复制代码
dataZoom:[]

避免一次渲染几十万点。


八、接口优化

防抖

搜索框:

复制代码
debounce(fn,500)

节流

滚动:

复制代码
throttle(fn,300)

请求缓存

可以用:

减少重复请求。


九、React 面试高频优化题

如果面试官问:

React 项目做过哪些性能优化?

可以按这个顺序回答:

复制代码
1. React.memo减少组件重复渲染
2. useMemo缓存计算结果
3. useCallback缓存函数
4. React.lazy实现路由懒加载
5. react-window实现虚拟列表
6. ECharts数据抽样和按需渲染
7. webpack分包与gzip压缩
8. 图片懒加载和CDN
9. debounce/throttle减少无效请求
10. Redux Selector缓存计算结果

相关推荐
木木爱研究3 分钟前
elpis-里程碑四-基于Vue完成动态组件库建设
前端·后端
深念Y6 分钟前
Nuxt 项目 Docker 构建:从 pnpm+node 迁移到全 bun
java·前端·docker
qq_426003967 分钟前
UI自动化元素定位不到解决方案
前端·pycharm·自动化
EthanChou202013 分钟前
AES67协议笔记
前端·笔记·es6
马优晨15 分钟前
pom.xml 中 jquery webjars 依赖解释
xml·前端·jquery·jquery webjars·webjars依赖
里欧跑得慢30 分钟前
AI 驱动的 UI 国际化方案自动适配:从单一语言到多语言布局的智能转换
前端·css·flutter·web
DolitD31 分钟前
云流技术深度剖析:单服务器下如何实现3D应用的多实例并发?
java·服务器·前端·3d·云原生·云计算
芦柑46438 分钟前
画布和3D导演台工具:短剧分镜从素材整理到空间预演的完整链路
服务器·前端·数据库
李蚊子1 小时前
从代理提醒到真实响铃:懒熊闹钟的鸿蒙开发实践
前端·harmonyos
IT_陈寒1 小时前
Redis的Lua脚本居然把我的集群搞崩了!
前端·人工智能·后端