Skip to content

imageOptimizer

构建后自动优化图片,支持 JPEG、PNG、WebP、AVIF、GIF、TIFF、SVG 格式的压缩与格式转换,使用 sharp 和 svgo 作为优化引擎。

导入

typescript
import { imageOptimizer } from '@meng-xi/vite-plugin'
// 或子模块导入
import { imageOptimizer } from '@meng-xi/vite-plugin/plugins/image-optimizer'

快速开始

typescript
import { defineConfig } from 'vite'
import { imageOptimizer } from '@meng-xi/vite-plugin'

export default defineConfig({
  plugins: [
    imageOptimizer({
      quality: { jpeg: 80, webp: 75 },
      convertToWebp: { png: true }
    })
  ]
})

依赖说明

本插件依赖以下可选依赖:

  • sharp — 位图优化(JPEG/PNG/WebP/AVIF/GIF/TIFF),未安装时跳过位图优化
  • svgo — SVG 优化,未安装时跳过 SVG 优化
bash
# 安装依赖
npm install sharp svgo -D

# 仅安装位图优化
npm install sharp -D

# 仅安装 SVG 优化
npm install svgo -D

TIP

两个依赖均为可选,插件会自动检测已安装的依赖并仅执行对应的优化任务。

配置选项

选项类型默认值说明
qualityFormatQualityOptions{ jpeg: 80, png: 6, webp: 75, avif: 50, gif: true, tiff: 'deflate' }各格式的压缩质量参数
convertToWebpPartial<Record<'jpeg' | 'png' | 'gif' | 'tiff', boolean>>{}将指定格式转换为 WebP
convertToAvifPartial<Record<'jpeg' | 'png' | 'gif' | 'tiff', boolean>>{}将指定格式转换为 AVIF
keepOriginalbooleantrue格式转换时是否保留原始文件

继承 BasePluginOptionsenabledlogLevelerrorStrategy

高级选项

选项类型默认值说明
convertMappingConvertMapping{}自定义格式转换映射,优先级高于上述两项
svgoSvgoOptions{}SVG 优化配置
includeExtensionsstring[]['.jpg', '.jpeg', '.png', '.webp', '.avif', '.gif', '.tiff', '.tif', '.svg']需要优化的文件扩展名
excludePathsstring[][]需要排除的路径前缀
thresholdnumber0最小优化阈值(字节),0 表示不限制
reportOutputstring | false'image-optimize-report.json'优化报告输出路径,false 不生成
parallelLimitnumber5并发优化最大文件数
maxPixelsnumber0单个图片最大像素数,0 表示不限制

类型导出

ImageFormat

支持的图片格式类型:'jpeg' | 'png' | 'webp' | 'avif' | 'gif' | 'tiff' | 'svg'

FormatQualityOptions

各格式的压缩质量参数。

属性类型默认值说明
jpegnumber80JPEG 质量(1-100)
pngnumber6PNG 压缩级别(1-9)
webpnumber75WebP 质量(1-100)
avifnumber50AVIF 质量(1-100)
gifbooleantrueGIF 是否尝试调色板优化
tiff'none' | 'lzw' | 'deflate' | 'packbits''deflate'TIFF 压缩算法

ConvertMapping

格式转换映射,键为源格式,值为目标格式。

typescript
type ConvertMapping = Partial<Record<ImageFormat, ImageFormat>>

SvgoOptions

SVG 优化配置。

属性类型默认值说明
pluginsSvgoPlugin[][]SVGO 插件列表
multipassbooleanfalse是否启用多进程优化

ImageOptimizeStats

单个文件的优化统计信息。

属性类型说明
filestring原始文件路径
relativePathstring相对于输出目录的相对路径
originalSizenumber原始文件大小(字节)
optimizedSizenumber优化后文件大小(字节)
rationumber压缩率百分比(0-100)
sourceFormatImageFormat源图片格式
outputFormatImageFormat输出图片格式(与 sourceFormat 不同表示格式转换)
convertedboolean是否发生了格式转换
durationnumber优化耗时(毫秒)

ImageOptimizeSummary

优化操作的汇总统计信息。

属性类型说明
totalFilesnumber优化的文件总数
skippedFilesnumber跳过的文件数量
failedFilesnumber失败的文件数量
totalOriginalSizenumber所有文件的原始大小总和
totalOptimizedSizenumber所有文件的优化后大小总和
totalRationumber总体压缩率百分比
byFormatRecord<string, { count, originalSize, optimizedSize, ratio }>按格式分组的统计
convertedFilesnumber格式转换的文件数量
executionTimenumber优化操作总耗时(毫秒)
statsImageOptimizeStats[]每个文件的详细优化统计

示例

基础压缩

typescript
imageOptimizer({
  quality: { jpeg: 80, png: 6, webp: 75 }
})

PNG 转 WebP

typescript
imageOptimizer({
  convertToWebp: { png: true }
})

多格式转换

typescript
imageOptimizer({
  convertToWebp: { png: true, jpeg: true },
  convertToAvif: { png: true },
  keepOriginal: true
})

自定义格式转换映射

typescript
imageOptimizer({
  convertMapping: {
    jpeg: 'webp',
    png: 'avif'
  }
})

SVG 优化

typescript
imageOptimizer({
  svgo: {
    plugins: [
      { name: 'removeViewBox', active: false },
      { name: 'removeEmptyContainers', active: true }
    ],
    multipass: true
  }
})

限制大图尺寸

typescript
imageOptimizer({
  maxPixels: 1920 * 1080, // 超过 1080p 的图片将被缩放
  quality: { jpeg: 75, webp: 70 }
})

注意事项

  • 插件使用 enforce: 'post' 确保在构建产物写入完成后执行
  • 体积守恒:仅压缩时,如果优化后文件更大则跳过(保留原文件);格式转换时始终生成新格式文件
  • keepOriginal: true 时格式转换会保留原始文件,输出文件使用新扩展名(如 logo.pnglogo.webp
  • keepOriginal: false 时格式转换会替换原始文件
  • sharpsvgo 均为可选依赖,未安装时插件会自动跳过对应类型的优化
  • 并发优化通过 parallelLimit 控制资源占用,默认 5 个并发
  • maxPixels 可用于限制超大图片的像素数,避免内存溢出

Released under the MIT License.