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/image-optimizer'
import type { ImageOptimizerOptions, ImageOptimizeStats, ImageOptimizeSummary, ImageFormat, FormatQualityOptions, SvgoPlugin, SvgoOptions } from '@meng-xi/vite-plugin/plugins/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
keepOriginalbooleanfalseKeep original files during conversion

Inherits BasePluginOptions: enabled, logLevel, 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
parallelLimitnumber10Maximum 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.pnglogo.webp)
  • keepOriginal: false (default) 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 10 concurrent operations
  • maxPixels can limit the pixel count of oversized images to avoid memory overflow

Released under the MIT License.