Skip to content

imageOptimizer ​

Automatically optimize images after Vite build, supporting compression and format conversion for JPEG, PNG, WebP, AVIF, GIF, TIFF, and SVG formats.

Import Methods ​

typescript
// Submodule import (recommended)
import { imageOptimizer } from '@meng-xi/vite-plugin/plugins/compress/image-optimizer'
import type { ImageOptimizerOptions, ImageOptimizeStats, ImageOptimizeSummary, ImageFormat, FormatQualityOptions, SvgoPlugin, SvgoOptions } from '@meng-xi/vite-plugin/plugins/compress/image-optimizer'

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

Quick Start ​

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 }
		})
	]
})

Dependencies ​

This plugin relies on the following optional dependencies:

  • sharp - Bitmap optimization (JPEG/PNG/WebP/AVIF/GIF/TIFF), skips bitmap optimization if not installed
  • svgo - SVG optimization, skips SVG optimization if not installed
bash
# Install both dependencies
npm install sharp svgo -D

# Bitmap optimization only
npm install sharp -D

# SVG optimization only
npm install svgo -D

TIP

Both dependencies are optional. The plugin automatically detects installed dependencies and only performs the corresponding optimization tasks.

Options ​

OptionTypeDefaultDescription
qualityFormatQualityOptions{ jpeg: 80, png: 6, webp: 75, avif: 50, gif: true, tiff: 'deflate' }Compression quality for each format
convertToWebpPartial<Record<'jpeg' | 'png' | 'gif' | 'tiff', boolean>>{}Convert specified formats to WebP
convertToAvifPartial<Record<'jpeg' | 'png' | 'gif' | 'tiff', boolean>>{}Convert specified formats to AVIF
keepOriginalbooleantrueKeep original files during conversion

Inherits BasePluginOptions: enabled, verbose, errorStrategy

Advanced Options ​

OptionTypeDefaultDescription
convertMappingConvertMapping{}Custom format conversion mapping, higher priority
svgoSvgoOptions{}SVG optimization configuration
includeExtensionsstring[]['.jpg', '.jpeg', '.png', '.webp', '.avif', '.gif', '.tiff', '.tif', '.svg']File extensions to optimize
excludePathsstring[][]Path prefixes to exclude
thresholdnumber0Minimum optimization threshold (bytes), 0 for no limit
reportOutputstring | false'image-optimize-report.json'Optimization report output path, false to skip
parallelLimitnumber5Maximum concurrent file optimization count
maxPixelsnumber0Maximum pixels per image, 0 for no limit

Type Definitions ​

FormatQualityOptions ​

Compression quality parameters for each format.

PropertyTypeDefaultDescription
jpegnumber80JPEG quality (1-100)
pngnumber6PNG compression level (1-9)
webpnumber75WebP quality (1-100)
avifnumber50AVIF quality (1-100)
gifbooleantrueWhether to try palette optimization
tiff'none' | 'lzw' | 'deflate' | 'packbits''deflate'TIFF compression algorithm

SvgoPlugin ​

SVGO single plugin configuration.

PropertyTypeDescription
namestringSVGO plugin name
...unknownPlugin parameters (e.g., active: boolean)

SvgoOptions ​

SVG optimization configuration.

PropertyTypeDefaultDescription
pluginsSvgoPlugin[][]SVGO plugin list
multipassbooleanfalseWhether to enable multi-pass optimization

ImageOptimizeStats ​

Optimization statistics for a single file.

PropertyTypeDescription
filestringOriginal file path
relativePathstringRelative path to output directory
originalSizenumberOriginal file size (bytes)
optimizedSizenumberOptimized file size (bytes)
rationumberCompression ratio percentage (0-100)
sourceFormatImageFormatSource image format
outputFormatImageFormatOutput image format (different from sourceFormat means conversion)
convertedbooleanWhether format conversion occurred
durationnumberOptimization time (ms)

ImageOptimizeSummary ​

Summary statistics for the optimization operation.

PropertyTypeDescription
totalFilesnumberTotal number of optimized files
skippedFilesnumberNumber of skipped files
failedFilesnumberNumber of failed files
totalOriginalSizenumberTotal original size of all files
totalOptimizedSizenumberTotal optimized size of all files
totalRationumberOverall compression ratio percentage
byFormatRecord<string, { count, originalSize, optimizedSize, ratio }>Statistics grouped by format
convertedFilesnumberNumber of format-converted files
executionTimenumberTotal optimization time (ms)
statsImageOptimizeStats[]Detailed optimization stats per file

Examples ​

Basic Compression ​

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

PNG to WebP ​

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

Multi-Format Conversion ​

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

Custom Format Conversion Mapping ​

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

SVG Optimization ​

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

Limit Large Image Size ​

typescript
imageOptimizer({
	maxPixels: 1920 * 1080, // Images exceeding 1080p will be scaled down
	quality: { jpeg: 75, webp: 70 }
})

Production Only ​

typescript
imageOptimizer({
	enabled: process.env.NODE_ENV === 'production',
	quality: { jpeg: 70, webp: 65 }
})

Notes ​

  • Uses enforce: 'post' to execute after build artifacts are written
  • Volume conservation: When only compressing, if the optimized file is larger, it is skipped (original preserved); format conversion always generates the new format file
  • keepOriginal: true retains the original file during conversion, output uses new extension (e.g., logo.png → logo.webp)
  • keepOriginal: false replaces the original file during conversion
  • sharp and svgo are both optional dependencies; the plugin automatically skips corresponding optimization types when not installed
  • Concurrent optimization is controlled via parallelLimit to manage resource usage, defaulting to 5 concurrent operations
  • maxPixels can limit the pixel count of oversized images to avoid memory overflow

Released under the MIT License.