Vite實現(xiàn)圖片壓縮的四種有效方法
重要提示:原主流插件 vite-plugin-imagemin 已不兼容 Vite5,會導(dǎo)致構(gòu)建失敗。本文整理了 4 種適用于 Vite5 及以下版本的圖片壓縮方案,涵蓋插件化與自定義腳本,兼顧易用性與靈活性。
方法 1:vite-plugin-image-optimizer(推薦 Windows 環(huán)境)
支持 Vite >=3 和 Node >=14
核心特性
- 技術(shù)底層:基于 Google 開源的
@squoosh/lib,純 JavaScript 實現(xiàn),無二進(jìn)制依賴(徹底避免 Windows 環(huán)境下的底層工具安裝失敗問題)。 - 核心能力:支持 PNG/JPG/GIF 壓縮,同時可自動轉(zhuǎn)換為 WebP/AVIF 等現(xiàn)代圖片格式(體積比傳統(tǒng)格式小 30%-50%)。
- 優(yōu)勢:安裝零門檻、跨平臺兼容性強,支持按文件類型配置壓縮參數(shù),且可自定義過濾文件(如排除小圖)。
步驟 1:安裝依賴
# 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)
import { defineConfig } from 'vite';
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';
export default defineConfig({
plugins: [
ViteImageOptimizer({
png: {
quality: 80 // 質(zhì)量(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 目錄
}),
],
});
關(guān)鍵注意事項
- 若需在開發(fā)環(huán)境預(yù)覽壓縮效果,可將
disable設(shè)為false,但會略微影響熱更新速度。 preserveOriginalFormat: true會同時保留原格式(如 PNG)和轉(zhuǎn)換后的現(xiàn)代格式(如 WebP),需在代碼中通過<picture>標(biāo)簽實現(xiàn)降級兼容(示例見「通用注意事項」)。
方法 2:rollup-plugin-imagemin(兼容 Rollup 生態(tài))
核心特性
- 技術(shù)底層:Rollup 官方生態(tài)插件,Vite 基于 Rollup 構(gòu)建,可直接復(fù)用,支持所有 imagemin 生態(tài)插件(如
imagemin-webp、imagemin-avif)。 - 優(yōu)勢:生態(tài)成熟、配置靈活,可精細(xì)控制每種圖片格式的壓縮邏輯,適合需要深度定制的場景。
- 不足:依賴
imagemin系列二進(jìn)制插件,Windows 環(huán)境需確保已安裝libpng等底層庫(可通過npm install --global windows-build-tools補裝)。
步驟 1:安裝依賴
需同時安裝核心插件和對應(yīng)圖片格式的壓縮插件:
# 核心插件 + 常用格式壓縮插件 npm install rollup-plugin-imagemin imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-webp imagemin-avif --save-dev
步驟 2:Vite 配置(vite.config.js)
import { defineConfig } from 'vite';
import imagemin from 'rollup-plugin-imagemin';
export default defineConfig({
plugins: [
imagemin({
// 壓縮插件集合(按格式配置)
plugins: [
// GIF 壓縮:optimizationLevel 1-3(3 最優(yōu))
imagemin.gifsicle({ optimizationLevel: 3 }),
// JPEG 壓縮:quality 0-100,progressive 啟用漸進(jìn)式加載
imagemin.mozjpeg({ quality: 80, progressive: true }),
// PNG 壓縮:quality [最小質(zhì)量, 最大質(zhì)量],speed 壓縮速度(1-11,1 最慢最優(yōu))
imagemin.pngquant({ quality: [0.7, 0.8], speed: 4 }),
// 自動轉(zhuǎn)換 PNG/JPG 為 WebP
imagemin.webp({ quality: 80 }),
// 自動轉(zhuǎn)換為 AVIF(壓縮率更高)
imagemin.avif({ quality: 75 }),
],
// 高級配置:過濾文件
include: /.(png|jpe?g|gif)$/i,
exclude: /public/icons/, // 排除無需壓縮的目錄(如小圖標(biāo))
}),
],
});
關(guān)鍵注意事項
- 若安裝時出現(xiàn)「二進(jìn)制依賴缺失」錯誤(如
pngquant安裝失敗),Windows 用戶可參考 imagemin 官方文檔 安裝依賴庫,Mac 用戶可通過brew install libpng補裝。 - 該插件僅在 構(gòu)建階段 生效,開發(fā)環(huán)境不處理圖片(不影響開發(fā)速度)。
方法 3:vite-plugin-compress(一站式資源壓縮)
核心特性
- 核心用途:主要用于壓縮 JS/CSS/HTML 等代碼資源,附帶圖片壓縮功能(基于
imagemin)。 - 優(yōu)勢:無需安裝多個插件,可同時處理代碼和圖片壓縮,適合追求「輕依賴」的小型項目。
- 不足:圖片壓縮功能為附加能力,不支持現(xiàn)代格式(WebP/AVIF)轉(zhuǎn)換,僅支持傳統(tǒng)格式(PNG/JPG/GIF)壓縮。
步驟 1:安裝依賴
npm install vite-plugin-compress --save-dev
步驟 2:Vite 配置(vite.config.js)
import { defineConfig } from 'vite';
import compress from 'vite-plugin-compress';
export default defineConfig({
plugins: [
compress({
// 1. 啟用圖片壓縮(默認(rèn) false,需手動開啟)
image: true,
// 2. 圖片壓縮參數(shù)(僅支持傳統(tǒng)格式)
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 壓縮率更高)
}),
],
});
關(guān)鍵注意事項
- 若僅需圖片壓縮,不建議使用此插件(功能不如專門的圖片插件全面);若需同時壓縮代碼和圖片,可優(yōu)先選擇。
- 圖片壓縮僅支持「壓縮體積」,不支持格式轉(zhuǎn)換,需現(xiàn)代格式時需搭配其他工具。
方法 4:自定義腳本(手動控制壓縮邏輯)
核心特性
- 實現(xiàn)方式:通過 Vite 的
build.onEnd鉤子,在構(gòu)建完成后調(diào)用imagemin核心庫手動處理圖片。 - 優(yōu)勢:完全自定義壓縮時機(jī)、壓縮目錄和參數(shù),適合插件配置頻繁出問題或有特殊需求的場景(如僅壓縮特定目錄的圖片)。
- 不足:需手動編寫邏輯,不支持開發(fā)環(huán)境預(yù)覽,僅在構(gòu)建后生效。
步驟 1:安裝依賴
# imagemin 核心庫 + 常用格式壓縮插件 npm install imagemin imagemin-pngquant imagemin-mozjpeg imagemin-gifsicle --save-dev
步驟 2:Vite 配置(vite.config.js)
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: {
// 構(gòu)建完成后執(zhí)行圖片壓縮(異步鉤子)
async onEnd() {
try {
// 1. 配置需要壓縮的圖片路徑(glob 語法)
const inputDir = resolve(__dirname, 'dist/assets/**/*.{png,jpg,jpeg,gif}');
// 2. 壓縮后的輸出目錄(此處與輸入目錄一致,即覆蓋原文件)
const outputDir = resolve(__dirname, 'dist/assets');
// 3. 執(zhí)行壓縮
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);
}
},
},
});
關(guān)鍵注意事項
- 若不想覆蓋原文件,可將
outputDir設(shè)為其他目錄(如dist/assets/compressed),但需同步修改代碼中圖片的引用路徑。 - 建議在
try/catch中包裹邏輯,避免壓縮失敗導(dǎo)致整個構(gòu)建流程中斷。
通用注意事項(避坑指南)
壓縮質(zhì)量的平衡
質(zhì)量參數(shù)(如 quality: 80)并非越高越好:過高會導(dǎo)致體積過大,過低會導(dǎo)致失真。建議根據(jù)場景調(diào)整:
- 產(chǎn)品圖 / 封面圖:
quality: 80-90(優(yōu)先保證清晰度); - 圖標(biāo) / 背景圖:
quality: 60-70(優(yōu)先控制體積)。
現(xiàn)代格式(WebP/AVIF)的兼容方案
現(xiàn)代格式體積小,但部分舊瀏覽器(如 IE)不支持,需通過 <picture> 標(biāo)簽實現(xiàn)降級:
<picture> <!-- 優(yōu)先加載 AVIF --> <source srcset="image.avif" type="image/avif"> <!-- 其次加載 WebP --> <source srcset="image.webp" type="image/webp"> <!-- 降級加載 PNG/JPG --> <img src="image.png" alt="示例圖片"> </picture>
開發(fā)環(huán)境不建議壓縮
圖片壓縮會消耗 CPU 資源,導(dǎo)致熱更新速度變慢。所有插件默認(rèn)在開發(fā)環(huán)境禁用壓縮,若需預(yù)覽效果,可臨時開啟(但不推薦長期使用)。
路徑問題排查
壓縮后若圖片加載失敗,需檢查:
- 插件的
include/exclude配置是否誤過濾了圖片目錄; - 自定義腳本的
inputDir路徑是否正確(可通過console.log(inputDir)打印驗證)。
場景化選擇建議
| 項目場景 | 推薦方案 | 核心原因 |
|---|---|---|
| Windows 環(huán)境、新手用戶 | vite-plugin-image-optimizer | 無二進(jìn)制依賴,安裝簡單,支持現(xiàn)代格式轉(zhuǎn)換 |
| 中大型項目、需深度定制 | rollup-plugin-imagemin | 生態(tài)成熟,可靈活擴(kuò)展 imagemin 插件 |
| 小型項目、需壓縮代碼 + 圖片 | vite-plugin-compress | 輕依賴,一站式處理所有靜態(tài)資源壓縮 |
| 特殊需求(如自定義壓縮時機(jī)) | 自定義腳本(imagemin + build.onEnd) | 完全手動控制,避免插件配置沖突 |
所有方案的核心壓縮能力均基于 imagemin 或 squoosh,最終壓縮效果差異極小,選擇時優(yōu)先考慮 兼容性、易用性 與項目實際需求即可。
以上就是Vite實現(xiàn)圖片壓縮的四種有效方法的詳細(xì)內(nèi)容,更多關(guān)于Vite圖片壓縮的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue項目中大文件切片上傳實現(xiàn)秒傳與斷點續(xù)傳的詳細(xì)實現(xiàn)過程
這篇文章主要給大家介紹了關(guān)于Vue項目中大文件切片上傳實現(xiàn)秒傳與斷點續(xù)傳的詳細(xì)實現(xiàn)過程, 在開發(fā)中,如果上傳的文件過大,可以考慮分片上傳,分片就是說將文件拆分來進(jìn)行上傳,將各個文件的切片傳遞給后臺,然后后臺再進(jìn)行合并,需要的朋友可以參考下2023-08-08
el-tree使用獲取當(dāng)前選中節(jié)點的父節(jié)點數(shù)據(jù)
本文主要介紹了el-tree使用獲取當(dāng)前選中節(jié)點的父節(jié)點數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
Vue基于el-breadcrumb實現(xiàn)面包屑功能(操作代碼)
這篇文章主要介紹了Vue基于el-breadcrumb實現(xiàn)面包屑功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Element-UI控件Tree實現(xiàn)數(shù)據(jù)樹形結(jié)構(gòu)的方法
這篇文章主要介紹了Element-UI控件Tree實現(xiàn)數(shù)據(jù)樹形結(jié)構(gòu),本期介紹添加、修改等功能也比較簡單,可以通過element-ui的$prompt彈框控件來實現(xiàn),需要的朋友可以參考下2024-01-01
關(guān)于element?ui的菜單default-active默認(rèn)選中的問題
這篇文章主要介紹了關(guān)于element?ui的菜單default-active默認(rèn)選中的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

