人人都会AI编程

22.3 Gzip / Brotli 压缩与 CDN 加速

更新时间:2026-07-11

打包优化做得再好,最终用户还是要通过网络下载这些资源。让文件体积更小、离用户更近,是首屏加载优化的两个最直接手段。这一节讲压缩算法和内容分发网络的具体落地方式,不讲虚的,只说怎么配、能快多少。

一、服务端启用 Gzip / Brotli 压缩

无论是 Webpack 还是 Vite 打包出来的 JS 和 CSS,本质都是文本文件。文本文件的压缩率极高,一个 1MB 的 JavaScript 文件经过 Gzip 压缩后通常只有 200~300KB,Brotli 还能再减少约 15%~25%。

关键认知:不要在构建阶段生成 .gz 文件,然后手动上传
现代部署方案的正确做法是:由 Web 服务器或 CDN 在响应时实时压缩。原因很简单:

  • 同一份源文件可以同时提供 Gzip 和 Brotli 两种编码(根据浏览器 Accept-Encoding 头自动选择)。
  • 静态预压缩文件反而会让部署流程变复杂,且无法享受 CDN 边缘节点的动态压缩优化。
Nginx 配置示例(最常用)
# 开启 Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;      # 小于1KB的文件不压缩,节省CPU
gzip_comp_level 6;         # 压缩级别1-9,6是均衡值
gzip_vary on;              # 告诉缓存服务器区分压缩和未压缩版本

# 开启 Brotli(需要编译 ngx_brotli 模块)
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
brotli_comp_level 6;

如果使用云服务商(阿里云 OSS、腾讯云 CDN 等),直接在控制台开启“智能压缩”即可,一行配置都不用写。像 Vercel、Netlify 这类平台则默认启用 Brotli,基本不需要额外配置。

真实收益:以一个 500KB 的 Vue 项目主 bundle 为例,开启 Brotli 后传输体积通常降至 120KB 左右。在 4G 网络下(下行速率约 2MB/s),传输时间从 250ms 变为约 60ms,对首屏有肉眼可见的提升。

二、CDN 加速:让文件离用户更近

CDN(Content Delivery Network,内容分发网络)的核心逻辑很简单:把你的静态文件(JS、CSS、图片等)提前分发到全球各地的边缘节点,用户请求时从物理距离最近的节点返回,减少网络延迟和连接建立时间。

在 Vue 项目中接入 CDN 的常见两种做法:

1. 构建时 publicPath 指向 CDN 域名

以 Vite 为例,在 vite.config.js 中配置:

export default defineConfig({
  base: 'https://static.yourdomain.com/frontend/',
  // ... 其他配置
})

构建后,所有资源引用的前缀都会变成 CDN 地址。部署时只需将 dist 目录的内容上传到 CDN 对应的路径下。

注意index.html 通常不放在 CDN 上(或设置极短的缓存),因为它需要及时更新引入的 JS/CSS 文件名(带 hash)。

2. 第三方库通过 CDN 外链引入

像 Vue、Vue Router、Pinia 这些核心库,如果使用 CDN 引入,可以减少打包体积,并且利用用户浏览器已有的缓存(因为 CDN URL 是全球统一的)。

实际生产项目不推荐这么做——因为:

  • 增加外部依赖,页面加载受第三方 CDN 稳定性的影响。
  • 现代打包工具的 Tree Shaking 和代码分割能力会被浪费,你无法按需加载仅用到的 Vue 特性函数。
  • 每次构建产出的应用代码与 CDN 库版本之间可能存在兼容性偏差。

结论:通过设置 base 把自己的构建产物托管到 CDN 是主流且安全的方案,而外链第三方 CDN 仅在极少数轻量项目或懒加载优化中有讨论价值。

CDN 缓存策略

上传到 CDN 的 Vite/Webpack 构建产物文件名都带有内容哈希(content hash),如 app-3a9b2c.js。因此可以大胆设置超长缓存时间:

Cache-Control: public, max-age=31536000, immutable

因为内容一变,文件名就变,不存在更新不及时的问题。index.html 文件则需设置短缓存或不缓存,确保最新版本的入口文件能及时推送给用户。

真实效果:一个原本主机托管在广州、用户在北京加载需要 1.2s 的 SPA,接入全国 CDN 后首次请求降至 400ms 左右,二次加载几乎瞬间。对于跨国业务,全球 CDN 的边际收益更加明显。

小结

  • 压缩这件事不要手动做,交给 Nginx 或 CDN 边缘节点自动处理,用 Brotli 替代 Gzip 能再挤出一部分体积。
  • CDN 加速的关键不是“配置有多难”,而是把带 hash 的静态资源推上去,配个长缓存,这是现代前端部署的标配。
  • 这两项优化成本极低,收益立竿见影,是每个生产项目上线前都应该确认的“基础体检项”。