Minify images seamlessly with support for multiple formats and plugin-based optimization
npx @tessl/cli install tessl/npm-imagemin@9.0.0imagemin is a Node.js library that provides seamless image minification through a plugin-based architecture. It supports multiple image formats (JPEG, PNG, GIF, SVG, WebP) and offers both file-based and buffer-based processing with glob pattern support for batch operations.
npm install imageminimport imagemin from 'imagemin';Note: This package only supports ES modules and requires Node.js 18+. CommonJS import is not supported.
import imagemin from 'imagemin';
import imageminJpegtran from 'imagemin-jpegtran';
import imageminPngquant from 'imagemin-pngquant';
// Process image files with plugins
const files = await imagemin(['images/*.{jpg,png}'], {
destination: 'build/images',
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.8]
})
]
});
console.log(files);
// Returns: [{data: Uint8Array, sourcePath: string, destinationPath: string}, ...]
// Process image buffer directly
import fs from 'node:fs/promises';
const buffer = await fs.readFile('image.jpg');
const optimizedBuffer = await imagemin.buffer(buffer, {
plugins: [imageminJpegtran()]
});imagemin follows a plugin-based architecture with these key components:
The main imagemin function processes image files from the filesystem using glob patterns.
/**
* Minify images from file paths or glob patterns
* @param {string[]} input - Array of file paths or glob patterns to process
* @param {Object} [options] - Processing options including destination and plugins
* @param {string} [options.destination] - Output directory path
* @param {Function[]} [options.plugins] - Array of imagemin plugins to apply
* @param {boolean} [options.glob=true] - Enable/disable glob pattern matching
* @returns {Promise<Array<Object>>} Promise resolving to array of processing results
*/
function imagemin(input, options);Parameters:
input: Array of file paths or glob patterns (e.g., ['images/*.jpg', 'photos/*.png'])options.destination: Optional output directory. If not provided, files are not written to diskoptions.plugins: Array of imagemin plugins to apply sequentiallyoptions.glob: Enable/disable glob pattern matching (default: true)Returns: Array of objects with the following properties:
data (Uint8Array): Optimized image datasourcePath (string): Original file pathdestinationPath (string|undefined): Output file path (undefined if no destination specified)Usage Examples:
// Basic file processing without saving
const results = await imagemin(['src/images/*.jpg']);
// Process and save to destination
const files = await imagemin(['src/images/*.{jpg,png}'], {
destination: 'dist/images',
plugins: [imageminJpegtran(), imageminPngquant()]
});
// Disable glob patterns for exact file paths
const exactFiles = await imagemin(['photo1.jpg', 'photo2.png'], {
glob: false,
plugins: [imageminJpegtran()]
});Process image data directly from memory without filesystem operations.
/**
* Minify image data from a buffer
* @param {Uint8Array} data - Image data as Uint8Array
* @param {Object} [options] - Processing options with plugins
* @param {Function[]} [options.plugins] - Array of imagemin plugins to apply
* @returns {Promise<Uint8Array>} Promise resolving to optimized image data
*/
imagemin.buffer(data, options);Parameters:
data (Uint8Array): Image data as Uint8Array (validated at runtime)options.plugins (Function[]): Array of imagemin plugins to apply sequentiallyReturns: Optimized image data as Uint8Array
Usage Examples:
import fs from 'node:fs/promises';
// Process buffer from file
const buffer = await fs.readFile('image.jpg');
const optimized = await imagemin.buffer(buffer, {
plugins: [imageminJpegtran()]
});
// Process buffer from HTTP response
const response = await fetch('https://example.com/image.jpg');
const imageBuffer = new Uint8Array(await response.arrayBuffer());
const result = await imagemin.buffer(imageBuffer, {
plugins: [imageminWebp()]
});imagemin uses a plugin-based architecture where plugins are functions that process image data. Plugins are applied sequentially using p-pipe.
/**
* Plugin function signature - all imagemin plugins follow this interface
* @param {Uint8Array|Buffer} buffer - Image data to process
* @returns {Promise<Uint8Array|Buffer>} Processed image data
*/
function imageminPlugin(buffer);Popular imagemin plugins for different formats:
imagemin throws errors in several scenarios:
Error Examples:
// Browser environment error
if (typeof window !== 'undefined') {
// Throws: "This package does not work in the browser."
}
// Type validation errors
await imagemin('not-an-array'); // Throws type error
await imagemin.buffer('not-a-buffer'); // Throws Uint8Array validation error
// Plugin processing errors
try {
await imagemin(['corrupt-image.jpg'], {
plugins: [imageminJpegtran()]
});
} catch (error) {
console.log(error.message); // "Error occurred when handling file: ..."
}imagemin automatically handles file extension changes based on output format:
.webp when using WebP pluginsAutomatically filters out system files:
.DS_Store (macOS)Thumbs.db (Windows)Skips processing of images with invalid dimensions (0x0 pixels) to handle corrupted files gracefully.
** for recursive matching