Vite 图片压缩的 4 种有效方法

重要提示 :原主流插件 vite-plugin-imagemin 已不兼容 Vite5,会导致构建失败。本文整理了 4 种适用于 Vite5 及以下版本的图片压缩方案,涵盖插件化与自定义脚本,兼顾易用性与灵活性。

方法 1:vite-plugin-image-optimizer(推荐 Windows 环境)

支持 Vite >=3Node >=14

核心特性

  • 技术底层 :基于 Google 开源的 @squoosh/lib,纯 JavaScript 实现,无二进制依赖(彻底避免 Windows 环境下的底层工具安装失败问题)。
  • 核心能力:支持 PNG/JPG/GIF 压缩,同时可自动转换为 WebP/AVIF 等现代图片格式(体积比传统格式小 30%-50%)。
  • 优势:安装零门槛、跨平台兼容性强,支持按文件类型配置压缩参数,且可自定义过滤文件(如排除小图)。

步骤 1:安装依赖

bash

arduino 复制代码
# npm
npm install vite-plugin-image-optimizer --save-dev
# yarn/pnpm
yarn add vite-plugin-image-optimizer -D
pnpm add vite-plugin-image-optimizer -D

步骤 2:Vite 配置(vite.config.js

javascript

运行

php 复制代码
import { defineConfig } from 'vite';
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';

export default defineConfig({
  plugins: [
    ViteImageOptimizer({
       png: {
        quality: 80 // 质量(0-100,值越高越清晰,体积越大)
      },
      jpeg: { quality: 80 },
      webp: {
        quality: 80,
        lossless: false
      },
      avif: { quality: 75 }, // AVIF 压缩率比 WebP 更高,但兼容性稍弱
      include: /\.(png|jpe?g|svg)$/i, // 仅处理指定格式
      exclude: /node_modules/ // 排除 node_modules 目录
    }),
  ],
});

关键注意事项

  • 若需在开发环境预览压缩效果,可将 disable 设为 false,但会略微影响热更新速度。
  • preserveOriginalFormat: true 会同时保留原格式(如 PNG)和转换后的现代格式(如 WebP),需在代码中通过 <picture> 标签实现降级兼容(示例见「通用注意事项」)。

方法 2:rollup-plugin-imagemin(兼容 Rollup 生态)

核心特性

  • 技术底层 :Rollup 官方生态插件,Vite 基于 Rollup 构建,可直接复用,支持所有 imagemin 生态插件 (如 imagemin-webpimagemin-avif)。
  • 优势:生态成熟、配置灵活,可精细控制每种图片格式的压缩逻辑,适合需要深度定制的场景。
  • 不足 :依赖 imagemin 系列二进制插件,Windows 环境需确保已安装 libpng 等底层库(可通过 npm install --global windows-build-tools 补装)。

步骤 1:安装依赖

需同时安装核心插件和对应图片格式的压缩插件:

bash

sql 复制代码
# 核心插件 + 常用格式压缩插件
npm install rollup-plugin-imagemin imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-webp imagemin-avif --save-dev

步骤 2:Vite 配置(vite.config.js

javascript

运行

javascript 复制代码
import { defineConfig } from 'vite';
import imagemin from 'rollup-plugin-imagemin';

export default defineConfig({
  plugins: [
    imagemin({
      // 压缩插件集合(按格式配置)
      plugins: [
        // GIF 压缩:optimizationLevel 1-3(3 最优)
        imagemin.gifsicle({ optimizationLevel: 3 }),
        // JPEG 压缩:quality 0-100,progressive 启用渐进式加载
        imagemin.mozjpeg({ quality: 80, progressive: true }),
        // PNG 压缩:quality [最小质量, 最大质量],speed 压缩速度(1-11,1 最慢最优)
        imagemin.pngquant({ quality: [0.7, 0.8], speed: 4 }),
        // 自动转换 PNG/JPG 为 WebP
        imagemin.webp({ quality: 80 }),
        // 自动转换为 AVIF(压缩率更高)
        imagemin.avif({ quality: 75 }),
      ],

      // 高级配置:过滤文件
      include: /.(png|jpe?g|gif)$/i,
      exclude: /public/icons/, // 排除无需压缩的目录(如小图标)
    }),
  ],
});

关键注意事项

  • 若安装时出现「二进制依赖缺失」错误(如 pngquant 安装失败),Windows 用户可参考 imagemin 官方文档 安装依赖库,Mac 用户可通过 brew install libpng 补装。
  • 该插件仅在 构建阶段 生效,开发环境不处理图片(不影响开发速度)。

方法 3:vite-plugin-compress(一站式资源压缩)

核心特性

  • 核心用途 :主要用于压缩 JS/CSS/HTML 等代码资源,附带图片压缩功能 (基于 imagemin)。
  • 优势:无需安装多个插件,可同时处理代码和图片压缩,适合追求「轻依赖」的小型项目。
  • 不足:图片压缩功能为附加能力,不支持现代格式(WebP/AVIF)转换,仅支持传统格式(PNG/JPG/GIF)压缩。

步骤 1:安装依赖

bash

css 复制代码
npm install vite-plugin-compress --save-dev

步骤 2:Vite 配置(vite.config.js

javascript

运行

php 复制代码
import { defineConfig } from 'vite';
import compress from 'vite-plugin-compress';

export default defineConfig({
  plugins: [
    compress({
      // 1. 启用图片压缩(默认 false,需手动开启)
      image: true,

      // 2. 图片压缩参数(仅支持传统格式)
      imageOptions: {
        mozjpeg: { quality: 80 }, // JPEG 压缩
        pngquant: { quality: [0.7, 0.8] }, // PNG 压缩
        gifsicle: { optimizationLevel: 3 }, // GIF 压缩
      },

      // 3. 代码压缩配置(插件核心能力,可选)
      gzip: true, // 启用 GZIP 压缩 JS/CSS
      brotli: true, // 启用 Brotli 压缩(比 GZIP 压缩率更高)
    }),
  ],
});

关键注意事项

  • 若仅需图片压缩,不建议使用此插件(功能不如专门的图片插件全面);若需同时压缩代码和图片,可优先选择。
  • 图片压缩仅支持「压缩体积」,不支持格式转换,需现代格式时需搭配其他工具。

方法 4:自定义脚本(手动控制压缩逻辑)

核心特性

  • 实现方式 :通过 Vite 的 build.onEnd 钩子,在构建完成后调用 imagemin 核心库手动处理图片。
  • 优势:完全自定义压缩时机、压缩目录和参数,适合插件配置频繁出问题或有特殊需求的场景(如仅压缩特定目录的图片)。
  • 不足:需手动编写逻辑,不支持开发环境预览,仅在构建后生效。

步骤 1:安装依赖

bash

arduino 复制代码
# imagemin 核心库 + 常用格式压缩插件
npm install imagemin imagemin-pngquant imagemin-mozjpeg imagemin-gifsicle --save-dev

步骤 2:Vite 配置(vite.config.js

javascript

运行

javascript 复制代码
import { defineConfig } from 'vite';
import imagemin from 'imagemin';
import imageminPngquant from 'imagemin-pngquant';
import imageminMozjpeg from 'imagemin-mozjpeg';
import imageminGifsicle from 'imagemin-gifsicle';
import { resolve } from 'path'; // 路径处理工具

export default defineConfig({
  build: {
    // 构建完成后执行图片压缩(异步钩子)
    async onEnd() {
      try {
        // 1. 配置需要压缩的图片路径(glob 语法)
        const inputDir = resolve(__dirname, 'dist/assets/**/*.{png,jpg,jpeg,gif}');
        // 2. 压缩后的输出目录(此处与输入目录一致,即覆盖原文件)
        const outputDir = resolve(__dirname, 'dist/assets');

        // 3. 执行压缩
        await imagemin([inputDir], {
          destination: outputDir,
          plugins: [
            imageminPngquant({ quality: [0.7, 0.8] }),
            imageminMozjpeg({ quality: 80 }),
            imageminGifsicle({ optimizationLevel: 3 }),
          ],
        });

        console.log('✅ 图片压缩完成!');
      } catch (error) {
        console.error('❌ 图片压缩失败:', error);
      }
    },
  },
});

关键注意事项

  • 若不想覆盖原文件,可将 outputDir 设为其他目录(如 dist/assets/compressed),但需同步修改代码中图片的引用路径。
  • 建议在 try/catch 中包裹逻辑,避免压缩失败导致整个构建流程中断。

通用注意事项(避坑指南)

  1. 压缩质量的平衡

    质量参数(如 quality: 80)并非越高越好:过高会导致体积过大,过低会导致失真。建议根据场景调整:

    • 产品图 / 封面图:quality: 80-90(优先保证清晰度);
    • 图标 / 背景图:quality: 60-70(优先控制体积)。
  2. 现代格式(WebP/AVIF)的兼容方案

    现代格式体积小,但部分旧浏览器(如 IE)不支持,需通过 <picture> 标签实现降级:

    html

    预览

    xml 复制代码
    <picture>
      <!-- 优先加载 AVIF -->
      <source srcset="image.avif" type="image/avif">
      <!-- 其次加载 WebP -->
      <source srcset="image.webp" type="image/webp">
      <!-- 降级加载 PNG/JPG -->
      <img src="image.png" alt="示例图片">
    </picture>
  3. 开发环境不建议压缩

    图片压缩会消耗 CPU 资源,导致热更新速度变慢。所有插件默认在开发环境禁用压缩,若需预览效果,可临时开启(但不推荐长期使用)。

  4. 路径问题排查

    压缩后若图片加载失败,需检查:

    • 插件的 include/exclude 配置是否误过滤了图片目录;
    • 自定义脚本的 inputDir 路径是否正确(可通过 console.log(inputDir) 打印验证)。

场景化选择建议

项目场景 推荐方案 核心原因
Windows 环境、新手用户 vite-plugin-image-optimizer 无二进制依赖,安装简单,支持现代格式转换
中大型项目、需深度定制 rollup-plugin-imagemin 生态成熟,可灵活扩展 imagemin 插件
小型项目、需压缩代码 + 图片 vite-plugin-compress 轻依赖,一站式处理所有静态资源压缩
特殊需求(如自定义压缩时机) 自定义脚本(imagemin + build.onEnd 完全手动控制,避免插件配置冲突

所有方案的核心压缩能力均基于 imageminsquoosh,最终压缩效果差异极小,选择时优先考虑 兼容性、易用性 与项目实际需求即可。

编辑分享

展开介绍一下vite-plugin-image-optimizer的安装依赖步骤

详细说明vite-plugin-compress在图片压缩方面的具体配置

有哪些其他的Vite插件可用于图片压缩?

相关推荐
Java 码农38 分钟前
nodejs koa留言板案例开发
前端·javascript·npm·node.js
ZhuAiQuan1 小时前
[electron]开发环境驱动识别失败
前端·javascript·electron
nyf_unknown1 小时前
(vue)将dify和ragflow页面嵌入到vue3项目
前端·javascript·vue.js
胡gh1 小时前
浏览器:我要用缓存!服务器:你缓存过期了!怎么把数据挽留住,这是个问题。
前端·面试·node.js
你挚爱的强哥2 小时前
SCSS上传图片占位区域样式
前端·css·scss
奶球不是球2 小时前
css新特性
前端·css
Nicholas682 小时前
flutter滚动视图之Viewport、RenderViewport源码解析(六)
前端
无羡仙2 小时前
React 状态更新:如何避免为嵌套数据写一长串 ...?
前端·react.js
TimelessHaze2 小时前
🔥 一文掌握 JavaScript 数组方法(2025 全面指南):分类解析 × 业务场景 × 易错点
前端·javascript·trae
jvxiao3 小时前
搭建个人博客系列--(4) 利用Github Actions自动构建博客
前端