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缓存计算结果

、

相关推荐
Lvan的前端笔记2 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
三天不学习2 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs194053 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
明月_清风4 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
Csvn5 小时前
框架性能优化
前端
回眸&啤酒鸭7 小时前
【回眸】OpenSwarm 多智能体协作系统实战指南
大数据·前端·人工智能
用户69371750013847 小时前
2026,程序员的时代拐点到了
android·前端·后端
大龄秃头程序员7 小时前
一次 iBeacon + BLE 无感解锁方案的实现记录
前端
小兔子7 小时前
Python 的 GIL 与 free-threading:3.13 之后「去 GIL」走到哪一步了
前端
IT_陈寒7 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端