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
  美国用户 → 美国节点 IP

CDN 缓存策略

# 静态资源(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 提供商

同分类其他题目