过早优化的开始
项目刚开始,团队就决定要做性能优化。理由是"性能很重要,要提前规划"。
我们做了这些优化:
- 代码分割,每个路由一个 chunk
- 懒加载,所有组件都用 React.lazy
- 图片懒加载,用 Intersection Observer
- API 请求缓存,用 React Query
- 虚拟滚动,长列表都用虚拟滚动
花了很多时间,但上线后发现,性能提升不明显。
性能分析
我们用 Chrome DevTools 做了性能分析,发现:
- 首屏渲染时间:2.5 秒
- JavaScript 执行时间:800ms
- 网络请求时间:1.5 秒
- 图片加载时间:500ms
真正影响性能的是网络请求,不是 JavaScript 执行。我们做的那些优化,对网络请求没用。
优化误区一:代码分割过度
我们把每个路由都分割成独立的 chunk,结果:
- chunk 文件太多,HTTP 请求次数增加
- 每个 chunk 都很小,但加载时间没减少
- 代码复杂度增加,维护成本高
后来我们发现,大部分路由的代码量不大,分割了也没用。只有几个大页面需要分割。
优化误区二:懒加载过度
我们把所有组件都懒加载了,结果:
- 首屏渲染时,很多组件要等加载
- 用户交互时,组件加载有延迟
- 代码复杂度增加,维护成本高
后来我们发现,只有大组件和很少用的组件需要懒加载。小组件和常用组件,直接加载更快。
优化误区三:缓存过度
我们用 React Query 缓存所有 API 请求,结果:
- 内存占用增加,缓存了很多不需要的数据
- 缓存失效逻辑复杂,经常出问题
- 代码复杂度增加,维护成本高
后来我们发现,只有很少的 API 需要缓存。大部分 API,每次都请求更快。
真正的性能问题
做了性能分析后,我们发现真正的性能问题是:
- API 响应慢:平均响应时间 1.5 秒,这是最大的瓶颈
- 图片太大:没有压缩,加载慢
- 没有 CDN:静态资源加载慢
- 没有 HTTP/2:请求并发数有限
我们做的那些优化,对这些问题没用。
正确的优化方向
我们调整了优化方向:
1. 优化 API
优化 API 响应时间:
- 加数据库索引,查询更快
- 用 Redis 缓存热点数据
- 优化 SQL 查询,减少查询次数
- 用连接池,减少连接开销
API 响应时间从 1.5 秒降到 300ms,性能提升很明显。
2. 优化图片
优化图片加载:
- 压缩图片,减小文件大小
- 用 WebP 格式,兼容性好的用 WebP
- 用 CDN,加速图片加载
- 用响应式图片,不同设备加载不同尺寸
图片加载时间从 500ms 降到 200ms。
3. 优化网络
优化网络请求:
- 用 CDN,加速静态资源加载
- 用 HTTP/2,提升并发性能
- 用 Gzip 压缩,减小传输大小
- 合并请求,减少请求次数
网络请求时间从 1.5 秒降到 800ms。
优化后的效果
调整优化方向后,性能提升很明显:
- 首屏渲染时间:从 2.5 秒降到 1.2 秒
- API 响应时间:从 1.5 秒降到 300ms
- 图片加载时间:从 500ms 降到 200ms
- 网络请求时间:从 1.5 秒降到 800ms
比之前的优化效果好多了。
经验总结
做了这次优化,总结几个经验:
- 先分析,再优化:用性能分析工具找出真正的瓶颈
- 不要过早优化:先让功能跑起来,再优化性能
- 优化要有针对性:针对真正的瓶颈优化,不要盲目优化
- 优化要有数据支撑:用数据说话,不要凭感觉
如果重新开始
如果重新做一个项目,我会:
- 先实现功能,再优化性能
- 用性能分析工具找出瓶颈
- 针对瓶颈优化,不要盲目优化
- 用数据验证优化效果
总结
性能优化很重要,但要找对方向。过早优化是万恶之源,浪费时间还没效果。
如果你们项目也在做性能优化,建议先做性能分析,找出真正的瓶颈。针对瓶颈优化,效果会好很多。
另外,优化要有数据支撑。不要凭感觉优化,要用数据说话。
评论区