FE-12-网络与性能优化:HTTP 缓存、CDN、懒加载
本节目标:理解 HTTP 缓存体系、CDN 原理、懒加载策略、Web Vitals 指标,能用 Chrome DevTools 诊断性能问题。
1. 性能指标
1.1 经典指标
1 | TTFB (Time To First Byte) 服务器响应时间 |
Core Web Vitals(2024+):
- LCP < 2.5s(优秀)
- INP < 200ms(优秀)
- CLS < 0.1(优秀)
1.2 测量工具
1 | Lighthouse(Chrome DevTools) 单页综合评分 |
2. HTTP 缓存机制
2.1 强缓存(不发送请求)
1 | 服务器响应: |
Cache-Control 指令:
1 | Cache-Control: max-age=3600 # 缓存 1 小时 |
实战设置:
1 | # 带 hash 的静态资源(永久缓存) |
2.2 协商缓存(304 Not Modified)
强缓存过期后:
1 | 请求头: |
ETag vs Last-Modified:
- ETag:内容哈希,更准确
- Last-Modified:修改时间,可能误判(内容没变但时间变了)
最佳实践:两者都设置。
2.3 Vary 响应头
根据不同请求返回不同内容时使用:
1 | Vary: Accept-Encoding # 不同压缩格式缓存不同 |
3. CDN 工作原理
3.1 什么是 CDN
CDN = Content Delivery Network,把内容缓存到全球边缘节点,让用户从最近的节点获取。
3.2 流程
1 | 用户(上海)请求 example.com/static/app.js |
3.3 常见 CDN
| 厂商 | 特点 |
|---|---|
| Cloudflare | 全球最大、免费档可用 |
| 阿里云 CDN | 国内快 |
| 腾讯云 CDN | 国内快 |
| AWS CloudFront | AWS 生态 |
| Fastly | Vercel 默认 |
| Vercel Edge | Next.js 默认 |
3.4 资源 URL 加 hash
1 | <!-- ❌ 旧资源被缓存 --> |
Webpack/Vite 自动处理:输出 app.[contenthash:8].js。
4. 懒加载(Lazy Loading)
4.1 图片懒加载
1 | <!-- 原生属性 --> |
4.2 路由懒加载
1 | // React |
4.3 组件懒加载
1 | // React: 可见时才加载 |
4.4 虚拟列表
1 | npm install react-window |
1 | import { FixedSizeList } from 'react-window'; |
5. 资源优化
5.1 图片
1 | <!-- 现代格式 + 响应式 --> |
工具:
- 压缩:
imagemin、sharp、squoosh - 格式转换:
cwebp、cavif
5.2 字体
1 | /* 关键:font-display */ |
Google Fonts 优化:
1 | <!-- preload 关键字体 --> |
5.3 JS Bundle
Tree-shaking:
1 | // ✓ 命名导入,能 tree-shake |
动态导入:
1 | // 按需加载 |
Bundle 分析:
1 | npx vite-bundle-visualizer |
6. 关键资源预加载
1 | <head> |
优先级:
1 | preload > prefetch |
7. Service Worker / PWA
1 | // sw.js |
应用场景:
- 离线访问
- 后台同步
- 推送通知
- 资源预缓存
8. Web Vitals 优化实战
8.1 LCP 优化
1 | <!-- 1. 预加载 LCP 图片 --> |
8.2 INP 优化
1 | // 1. 长任务拆分 |
8.3 CLS 优化
1 | <!-- 1. 图片/视频必须有 width/height --> |
9. 实战:性能优化 checklist
1 | □ HTML 体积 < 50KB(首屏) |
10. DevTools 实战
Performance 面板:
1 | 1. Ctrl+Shift+E 录制 |
Coverage 面板:
1 | - 显示每个 JS/CSS 文件的未使用比例 |
Lighthouse 面板:
1 | - Performance / Accessibility / Best Practices / SEO / PWA |
小结
| 优化 | 措施 |
|---|---|
| 减少请求 | 合并、雪碧图、inline SVG、icon font |
| 减小体积 | Tree-shake、压缩、gzip/brotli |
| 延迟加载 | 路由懒加载、图片 lazy、虚拟列表 |
| 缓存 | Cache-Control、Service Worker、HTTP 缓存 |
| CDN | 静态资源全走 CDN |
| 预加载 | preload、prefetch、preconnect |
| 渲染 | SSR/SSG、流式响应、Suspense |
| 监控 | RUM、web-vitals、Performance API |
性能预算(参考):
- JS bundle < 200KB gzipped
- LCP < 2.5s
- TTI < 3.8s
- Lighthouse Performance > 90
下一节讲前端测试:单元/集成/E2E(Vitest/Playwright)。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/09/20/FE-12-网络与性能优化/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!