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

相关推荐
kyriewen4 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒4 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
小林攻城狮5 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦5 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer5 小时前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队5 小时前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY5 小时前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_6 小时前
OpenSpec 完整详细介绍
前端·后端
召钱熏6 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
SkyWalking中文站6 小时前
认识 Horizon UI · 1/17:SkyWalking 新一代可观测性控制台
运维·前端·监控