CDN 的工作原理是什么?前端如何利用 CDN 优化?
CDN(Content Delivery Network)
内容分发网络,将资源缓存到全球各地的边缘节点,用户就近获取,减少延迟。
工作原理
用户请求 cdn.example.com/image.jpg
→ DNS 解析:返回最近的 CDN 边缘节点 IP
→ 用户请求边缘节点
→ 边缘节点有缓存?→ 直接返回(缓存命中)
→ 无缓存 → 回源站获取 → 缓存并返回DNS 智能解析
普通 DNS:
example.com → 固定 IP
CDN DNS:
cdn.example.com → CNAME → xxx.cdn-provider.net
→ 根据用户 IP 返回最近的边缘节点 IP
北京用户 → 北京节点 IP
广州用户 → 广州节点 IP
美国用户 → 美国节点 IPCDN 缓存策略
# 静态资源(JS/CSS/图片)
Cache-Control: public, max-age=31536000, immutable
# 内容变化时文件名变(哈希),所以可以长期缓存
# HTML
Cache-Control: no-cache
# 每次回源验证
# API 响应
Cache-Control: private, no-cache
# 不经过 CDN 缓存前端利用 CDN
1. 静态资源部署到 CDN
// Vite 配置
export default {
base: 'https://cdn.example.com/assets/'
// 所有资源路径前缀变为 CDN 地址
}
// HTML 引用
<script src="https://cdn.example.com/assets/app.a1b2c3.js"></script>2. 第三方库使用 CDN
<!-- 使用公共 CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>3. 构建时 externals
// Vite 配置:不打包 vue/react,使用 CDN
export default {
build: {
rollupOptions: {
external: ['vue', 'vue-router']
}
}
}
// HTML 中引入 CDN
<script src="https://cdn.jsdelivr.net/npm/vue@3"></script>4. 图片 CDN
<!-- 图片 CDN + 响应式 -->
<img
src="https://imgcdn.example.com/photo.jpg?w=800"
srcset="https://imgcdn.example.com/photo.jpg?w=400 400w,
https://imgcdn.example.com/photo.jpg?w=800 800w"
/>CDN 加速类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 静态加速 | 缓存 JS/CSS/图片 | Cloudflare、阿里云 CDN |
| 动态加速 | 优化路由、TCP 优化 | 阿里云 DCDN |
| 下载加速 | 大文件分发 | 软件下载 |
| 视频加速 | 流媒体分发 | 直播/点播 |
| 安全加速 | WAF + DDoS 防护 | Cloudflare |
CDN 回源
边缘节点缓存未命中时,向源站请求:
边缘节点 → 源站(你的服务器/OSS)回源率:回源请求 / 总请求。优化目标:降低回源率。
CDN 刷新/预热
- 刷新:主动清除缓存(发布新版本时)
- 预热:主动预加载资源到边缘节点(大促前)
常见 CDN 提供商
- 国际:Cloudflare、AWS CloudFront、Akamai
- 国内:阿里云 CDN、腾讯云 CDN、七牛云