CDN(Content Delivery Network,内容分发网络),本质上是一个由遍布全球的边缘服务器节点组成的分布式网络。它的核心作用是:将网站内容缓存到离用户最近的服务器上,让用户就近获取数据。
当用户访问一个使用了 CDN 的网站时,流程是这样的:
| 资源类型 | 适合程度 | 原因 |
|---|---|---|
| CSS/JS 文件 | ⭐⭐⭐⭐⭐ | 体积大、变更频率低、缓存收益高 |
| 图片/字体 | ⭐⭐⭐⭐⭐ | 不常变更、适合长期缓存 |
| 第三方库(Vue/React) | ⭐⭐⭐⭐⭐ | 跨项目可共享缓存,命中率高 |
| HTML 文件 | ⭐⭐ | 更新频繁、缓存策略难控制 |
| API 响应 | ⭐ | 动态内容、不宜缓存 |
| 资源类型 | 适合程度 | 原因 |
|---|---|---|
| CSS/JS 文件 | ⭐⭐⭐⭐⭐ | 体积大、变更频率低、缓存收益高 |
| 图片/字体 | ⭐⭐⭐⭐⭐ | 不常变更、适合长期缓存 |
| 第三方库(Vue/React) | ⭐⭐⭐⭐⭐ | 跨项目可共享缓存,命中率高 |
| HTML 文件 | ⭐⭐ | 更新频繁、缓存策略难控制 |
| API 响应 | ⭐ | 动态内容、不宜缓存 |
什么情况下依赖不随着webpack打包,放到cdn里更合适?
CDN 的优势公式是:收益 =(依赖体积 × 跨项目复用次数)- 额外请求开销
| 场景 | 为什么合适 | 典型例子 |
|---|---|---|
| 大型第三方库 | 体积大(>100KB),被全网大量站点共用,缓存命中率极高 | Vue、React、ECharts、lodash、moment |
| 企业多项目共享 | 同一用户在不同系统间切换时,依赖可复用缓存 | 公司所有后台共用同一套 UI 库 |
| 全球用户访问 | CDN 边缘节点可大幅降低跨地域延迟 | 出海应用、跨境电商、国际化站点 |
| 源站带宽瓶颈 | CDN 分担 80%+ 流量,降低服务器成本 | 高流量站点、文件下载服务 |
| 静态资源为主 | 图片、视频、字体等不常变更的资源,缓存收益最大 | 电商网站、内容平台、设计作品站 |
| 需要 DDoS 防护 | CDN 边缘节点天然具备安全防护能力 | 金融、游戏、政务类网站 |
| 场景 | 为什么不合适 | 典型例子 |
|---|---|---|
| 小型项目,主包 < 500KB | 额外请求开销可能超过缓存收益,反而拖慢首屏 | 个人博客、小型官网、静态展示页 |
| 依赖体积很小(<20KB) | 单独发 HTTP 请求的成本高于直接打包 | 小型工具库、单函数工具 |
| 资源更新极其频繁 | 缓存命中率极低,CDN 形同虚设 | 实时数据接口、动态生成的内容 |
| 用户集中在同一区域 | CDN 全球加速优势无法发挥,徒增复杂度 | 本地企业站、区域政务系统 |
| 内网/无法访问外网 | CDN 完全不可用 | 企业内部系统、政务内网 |
| 安全合规限制 | 数据不能经过第三方节点 | 金融交易系统、医疗核心系统 |
