webpack gzip

161 阅读1分钟

一、Gzip 压缩原理与作用

1. 核心原理

  • Gzip 是一种数据压缩算法,通过查找数据中的重复模式(如字符串、字节序列),用更短的符号替换,减少数据体积。
  • 例如:文本文件中重复的关键词、HTML/CSS 中的冗余空格,压缩后体积可减少 50%-70%。

2. 在 Webpack 中的作用

  • 打包后的静态资源(JS/CSS/HTML)经 Gzip 压缩后,可减少网络传输量,提升页面加载速度。
  • 注意:Gzip 压缩是预处理,服务器需配置响应头(Content-Encoding: gzip)告知浏览器使用压缩数据。

二、Webpack 中实现 Gzip 压缩的两种方式

1. 方案一:使用 compression-webpack-plugin

  • 配置步骤
    // webpack.config.js
    const CompressionPlugin = require('compression-webpack-plugin');
    
    module.exports = {
      plugins: [
        new CompressionPlugin({
          algorithm: 'gzip', // 压缩算法
          test: /\.(js|css|html|svg)$/, // 匹配压缩文件类型
          threshold: 10240, // 超过10KB的文件才压缩
          minRatio: 0.8, // 压缩率小于0.8才会应用
          filename: '[path][base].gz' // 压缩后文件名
        })
      ]
    };
    
  • 打包结果:生成 .gz 后缀的压缩文件(如 main.js.gz)。

2. 方案二:配合 Nginx 动态压缩(更推荐)

  • Webpack 配置(无需插件):仅需打包原始文件,服务器动态压缩。
  • Nginx 配置
    gzip on;
    gzip_types text/plain text/css application/javascript image/svg+xml;
    gzip_comp_level 6; // 压缩级别(1-9,默认6,数值越高压缩率越高但耗时越长)
    gzip_vary on; // 让代理服务器识别是否启用压缩
    
  • 优势
    • 节省打包时间(无需预处理压缩);
    • 动态压缩最新资源,避免缓存过期问题。

三、Gzip 压缩的性能权衡

维度预处理压缩(compression-webpack-plugin)动态压缩(Nginx)
服务器压力无(压缩在打包阶段完成)有(消耗CPU资源)
网络传输传输压缩包,体积更小传输原始文件,动态压缩后体积相同
缓存策略需手动管理 .gz 文件缓存浏览器自动缓存压缩结果
适用场景静态资源(如CDN部署)动态资源(如API接口)

四、问题

1. 问:Gzip 压缩能减少多少文件体积?是否所有文件都适合压缩?

    • 文本类文件(JS/CSS/HTML)压缩率可达 50%-70%,二进制文件(图片/视频)压缩效果差(可能体积反而增大)。
    • 不适合压缩的文件
      • 已压缩的文件(如.jpg/.webp 图片);
      • 体积过小的文件(如小于 1KB 的文件,压缩后可能更大)。

2. 问:前端 Gzip 压缩和后端 Gzip 压缩有什么区别?

    • 前端预处理压缩
      • 在 Webpack 打包时生成 .gz 文件,部署到服务器后直接返回压缩包;
      • 优势:节省服务器 CPU 资源,适合静态资源;
      • 缺点:每次代码更新需重新打包压缩。
    • 后端动态压缩
      • 服务器接收到请求后,实时压缩原始文件并返回;
      • 优势:无需修改打包流程,适合动态资源;
      • 缺点:消耗服务器 CPU 资源。

3. 问:如何验证 Gzip 压缩是否生效?

    • 浏览器 DevTools 检查
      1. 打开 Network 面板,刷新页面;
      2. 查看响应头 Content-Encoding 是否为 gzip
      3. 对比 Size(原始大小)和 Content-Length(压缩后大小)。
    • 命令行验证
      # 查看压缩率
      gzip -l main.js.gz 
      

4. 问:Gzip 压缩与 Brotli 压缩的区别?

    • Brotli 压缩率更高:比 Gzip 多压缩 20%-30%,但压缩耗时更长;
    • 兼容性差异:Brotli 需浏览器支持(如 Chrome/Edge 支持,IE 不支持);
    • 部署建议
      • 优先使用 Brotli(brotli-webpack-plugin),并配置 Gzip 作为 fallback;
      • 服务器配置 Accept-Encoding 响应头,根据浏览器支持情况返回对应压缩格式。

五、Gzip 压缩的优化实践

1. 合理配置压缩阈值

  • threshold 设置为 10KB:小于该值的文件压缩后可能体积更大,浪费 CPU 资源。

2. 结合 CDN 缓存

  • .gz 文件部署到 CDN,利用 CDN 的边缘节点缓存,减少源站压力。

3. 按需压缩文件类型

  • 仅压缩文本类文件,忽略图片/字体等二进制文件:
    test: /\.(js|css|html|json|svg)$/
    

4. 与 HTTP/2 配合

  • HTTP/2 支持头部压缩(HPACK),与 Gzip 结合可进一步减少传输体积。