A Plugin and Loader forwebpack to optimize (compress) all images usingimagemin.Do not worry about size of images, now they are always optimized/compressed.
This plugin can use four different tools to optimize or generate images:
imagemin - Optimize your images by default, since it is stable and works with all types of imagessquoosh - while working in experimental mode with.jpg,.jpeg,.png,.webp,.avif file types.sharp - High performance Node.js image processing, the fastest module to resize and compress JPEG, PNG, WebP, AVIF and TIFF images. Uses the libvips library.svgo - tool for optimizing SVG vector graphics files. Supports only SVG files minification.[!WARNING]
By default, we don’t install any additional packages.
To begin, you'll need to installimage-minimizer-webpack-plugin along with an image optimizer or generator:
npm install image-minimizer-webpack-plugin imagemin --save-dev[!WARNING]
imagemin uses plugins to optimize or generate images, so you’ll need to install those as well.
squoosh:npm install image-minimizer-webpack-plugin @squoosh/lib --save-devnpm install image-minimizer-webpack-plugin sharp --save-devsvgo:npm install image-minimizer-webpack-plugin svgo --save-devImages can be optimized in two modes:
imagemin[!NOTE]
- imagemin-mozjpeg can be configured in lossless and lossy mode.
- imagemin-svgo can be configured in lossless and lossy mode.
Explore the available options to find the best results for your use case.
Recommendedimagemin plugins for lossless optimization
npminstall imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo --save-devRecommendedimagemin plugins for lossy optimization
npminstall imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-devForimagemin-svgo v9.0.0+, you need to use the officialSVGO configuration
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},],}, optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{// Lossless optimization with custom option// Feel free to experiment with options for better results! plugins:[["gifsicle",{ interlaced:true}],["jpegtran",{ progressive:true}],["optipng",{ optimizationLevel:5}],// SVGO configuration here https://github.com/svg/svgo#configuration["svgo",{ plugins:[{ name:"preset-default", params:{ overrides:{ removeViewBox:false, addAttributesToSVGElement:{ params:{ attributes:[{ xmlns:"http://www.w3.org/2000/svg"},],},},},},},],},],],},},}),],},};squooshnpm install @squoosh/lib --save-devRecommended@squoosh/lib options for lossy optimization
For lossy optimization, we recommend using the default settings of@squoosh/lib package.The default values and supported file types for each option can be found in thecodecs.ts file undercodecs directory.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`; not needed for `new URL(...)` syntax{ test:/\.(jpe?g|png)$/i, type:"asset",},],}, optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.squooshMinify, options:{// Your options for `squoosh` here},},}),],},};Recommendedsquoosh options for lossless optimization
For lossless optimization we recommend using the options listed below inminimizer.options.encodeOptions.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`, for `new URL(...)` syntax you don't need it{ test:/\.(jpe?g|png)$/i, type:"asset",},],}, optimization:{ minimizer:[newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.squooshMinify, options:{ encodeOptions:{ mozjpeg:{// That setting might be close to lossless, but it’s not guaranteed// See https://github.com/GoogleChromeLabs/squoosh/issues/85 quality:100,}, webp:{ lossless:1,}, avif:{// See https://github.com/GoogleChromeLabs/squoosh/blob/dev/codecs/avif/enc/README.md cqLevel:0,},},},},}),],},};sharpnpm install sharp --save-devRecommendedsharp options for lossy optimization
For lossy optimization we recommend using the default settings ofsharp package.The default values and supported file types for each option can be found in thesharp documentation.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`, for `new URL(...)` syntax you don't need it{ test:/\.(jpe?g|png)$/i, type:"asset",},],}, optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.sharpMinify, options:{ encodeOptions:{// Customize your `sharp` options here// See https://sharp.pixelplumbing.com/api-output},},},}),],},};Recommendedsharp options for lossless optimization
For lossless optimization we recommend using the options listed below inminimizer.options.encodeOptions.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`. Not needed for `new URL(...)` syntax{ test:/\.(jpe?g|png)$/i, type:"asset",},],}, optimization:{ minimizer:[newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.sharpMinify, options:{ encodeOptions:{ jpeg:{// https://sharp.pixelplumbing.com/api-output#jpeg quality:100,}, webp:{// https://sharp.pixelplumbing.com/api-output#webp lossless:true,}, avif:{// https://sharp.pixelplumbing.com/api-output#avif lossless:true,},// PNG by default sets the quality to 100%, which is same as lossless// https://sharp.pixelplumbing.com/api-output#png png:{},// GIF does not support lossless compression at all// https://sharp.pixelplumbing.com/api-output#gif gif:{},},},},}),],},};svgonpm install svgo --save-devRecommendedsvgo options for optimization
For SVG optimization we recommend using the options listed below inminimizer.options.encodeOptions.The default values for plugins can be found in thesvgo plugins source code.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`. Not needed for `new URL(...)` syntax{ test:/\.(svg)$/i, type:"asset",},],}, optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.svgoMinify, options:{ encodeOptions:{// Pass over SVGs multiple times to ensure all optimizations are applied (False by default) multipass:true, plugins:[// Built-in plugin preset enabled by default// See: https://github.com/svg/svgo#default-preset"preset-default",],},},},}),],},};If you want to useloader orplugin standalone see sections below, but this isnot recommended.
By default, plugin configuresloader (please use theloader option if you want to disable this behaviour), therefore you should not setup standalone loader when you use a plugin setup.
Loader optimizes or generates images using options, so inlined images viadata URI (i.e.data:) will be optimized or generated too, non-inlined images will be optimized too.
squoosh andsharp currently)The plugin supports the following query parameters:
width/w - allows you to set the image width
height/h - allows you to set the image height
as - to specify thepreset option
Only supported forsharp currently:
unit/u - can bepx orpercent and allows you to resize by a percentage of the image's size.
Examples:
const myImage1=newURL("image.png?width=150&height=120",import.meta.url);const myImage2=newURL("image.png?w=150&h=120",import.meta.url);// You can omit one of the parameters to auto-scaleconst myImage3=newURL("image.png?w=150",import.meta.url);// It works with the `preset` query parameterconst myImage4=newURL("image.png?as=webp&w=150&h=120",import.meta.url);// You can use `auto` to reset `width` or `height` from the `preset` optionconst myImage5=newURL("image.png?as=webp&w=150&h=auto",import.meta.url);// You can use `unit` to get the non-retina resize of images that are retina sizedconst myImage6=newURL("image.png?width=50&unit=percent",import.meta.url);.class{background:url("./image.png?width=150&height=120");}<picture><sourcesrcset="photo.jpg?as=avif&width=150&height=120"type="image/avif"/><sourcesrcset="photo.jpg?as=webp&width=150&height=120"type="image/webp"/><imgsrc="photo.jpg?width=150&height=120"alt="photo"/></picture>[!NOTE]
You need to setup
avifandwebppresets, See theexample for webp.
In yourwebpack.config.js, add theImageMinimizerPlugin.loader and specify theasset modules options (if you use images inimport):
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`. Not needed for `new URL(...)` syntax{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},// We recommend using only for the "production" mode{ test:/\.(jpe?g|png|gif|svg)$/i, enforce:"pre", use:[{ loader: ImageMinimizerPlugin.loader, options:{ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},},},],},],},};webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[// You need this, if you are using `import file from "file.ext"`. Not needed for `new URL(...)` syntax{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},],}, optimization:{ minimizer:[// Extend default minimizer, i.e. `terser-webpack-plugin` for JS"...",// We recommend using only for the "production" modenewImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},}, loader:false,// Disable the `loader`}),],},};testType:
typetest=string| RegExp|(string| RegExp)[];Default:/\.(jpe?g\|png\|gif\|tif\|webp\|svg\|avif)\$/i
Test to match files against.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ test:/\.(jpe?g|png|gif|svg)$/i,}),],},};includeType:
typeinclude=string| RegExp|(string| RegExp)[];Default:undefined
Files to include.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ include:/\/includes/,}),],},};excludeType:
typeexclude=string| RegExp|(string| RegExp)[];Default:undefined
Files to exclude.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ exclude:/\/excludes/,}),],},};minimizerType:
typeminimizer=|{ implementation:( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?: Record<string,any>|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}|{ implementation:( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?: Record<string,any>|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}[];Default:undefined
Allows to setup default minify function.
ImageMinimizerPlugin.imageminMinifyImageMinimizerPlugin.squooshMinifyImageMinimizerPlugin.sharpMinifyImageMinimizerPlugin.svgoMinifyimageminwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{// Implementation implementation: ImageMinimizerPlugin.imageminMinify,// Options options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};More information and exampleshere.
squooshwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{// Implementation implementation: ImageMinimizerPlugin.squooshMinify,// Options options:{ encodeOptions:{ mozjpeg:{ quality:90,},},},},}),],},};More information and exampleshere.
sharpwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{// Implementation implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},}),],},};More information and exampleshere.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{implementation:async(original, options)=>{const inputExt= path.extname(original.filename).toLowerCase();if(inputExt!==".xxx"){// Return `null` if the implementation does not support this file typereturnnull;}let result;try{ result=awaitminifyAndReturnBuffer(original.data);}catch(error){// Store error and return `null` if there was an error original.errors.push(error);returnnull;}return{ filename: original.filename, data: result, warnings:[...original.warnings], errors:[...original.errors], info:{...original.info,// Please always set it to prevent double minification minimized:true,// Optional minimizedBy:["custom-name-of-minimication"],},};}, options:{// Custom options},},}),],},};Allows to setup multiple minimizers.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:[{// `sharp` will handle all bitmap formats (JPG, PNG, GIF, ...) implementation: ImageMinimizerPlugin.sharpMinify,// exclude SVG if implementation support it. Not required for `sharp`.// filter: (source, sourcePath) => !(/\.(svg)$/i.test(sourcePath)), options:{ encodeOptions:{// Your options for `sharp`// https://sharp.pixelplumbing.com/api-output},},},{// `svgo` will handle vector images (SVG) implementation: ImageMinimizerPlugin.svgoMinify, options:{ encodeOptions:{// Pass over SVGs multiple times to ensure all optimizations are applied. False by default multipass:true, plugins:[// set of built-in plugins enabled by default// see: https://github.com/svg/svgo#default-preset"preset-default",],},},},],}),],},};implementationType:
typeimplementation=( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: BasicTransformerOptions<T>,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;};Default:undefined
Configure the defaultimplementation.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{// Implementation implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},}),],},};optionsType:
typeoptions= Record<string,any>;Default:undefined
Options for theimplementation option (i.e. options forimagemin/squoosh/sharp/custom implementation).
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},}),],},};filterType:
typefilter=(source: Buffer, sourcePath:string)=>boolean|undefined;Default:() => true
Allows filtering of images for optimization or generation.
Returntrue to process (optimize or generate) the image, orfalse to skip it.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{filter:(source, sourcePath)=>{// The `source` argument is a `Buffer` of source file// The `sourcePath` argument is an absolute path to sourceif(source.byteLength<8192){returnfalse;}returntrue;}, implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};filenameType:
typefilename=|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;Default:undefined
Allows to set the filename.Supported values see inwebpack template strings (see theFile-level section for supported patterns).
We also support[width] and[height] placeholders (only when usingsharp andsquoosh).
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ filename:"optimized-[name][ext]", implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},}),],},};Examplefunction usage:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{filename:()=>"optimized-[name][ext]", implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},}),],},};generatorType:
typegenerator={ implementation:( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?: Record<string,any>|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined; preset?:string|undefined;type?:"import"|"asset"|undefined;}[];Default:undefined
Allow to setup default image generators.This is useful when you want to generate additional formats likewebp,avif, etc., from the original images.
[!WARNING]
If no generator was found for the image (i.e. no
?as=webpwas found in query params), theminimizeroption will be used.Therefore, it is recommended to configure generator outputs optimized image.
[!WARNING]
The option will not work if you disable the
loader(i.e. set theloaderoption tofalse).
ImageMinimizerPlugin.imageminGenerateImageMinimizerPlugin.squooshGenerateImageMinimizerPlugin.sharpGenerateimageminExamplewebp generator:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp`// You can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.imageminGenerate, options:{// Please specify only one plugin here, multiple plugins will not work plugins:["imagemin-webp"],},},],}),],},};squooshwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.squooshGenerate, options:{ encodeOptions:{// Please specify only one codec here, multiple codecs will not work webp:{ quality:90,},},},},],}),],},};sharpwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ encodeOptions:{// Please specify only one codec here, multiple codecs will not work webp:{ quality:90,},},},},],}),],},};Now you can generate the new image using:
// Old approach for getting URLimport webpfrom"./file.jpg?as=webp";// Assets modulesconsole.log(newURL("./file.jpg?as=webp"));div{background:url("./file.jpg?as=webp");}You can use?as=webp in any type of files.
Example multiple generators:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ encodeOptions:{ webp:{ lossless:false,},},},},{// You can apply generator using `?as=avif`, you can use any name and provide more options preset:"avif", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ encodeOptions:{ avif:{ lossless:false,},},},},],}),],},};squoosh andsharp generator supports more options, for example you can resize an image:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp-100-50`, you can use any name and provide more options preset:"webp-100-50",// implementation: ImageMinimizerPlugin.squooshGenerate, implementation: ImageMinimizerPlugin.sharpGenerate, options:{ resize:{ enabled:true, width:100, height:50,}, encodeOptions:{ webp:{ quality:90,},},},},],}),],},};You can find more information in thesquoosh GitHub repository.
For onlysharp currently, you can even generate the non-retina resizes of images:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp-1x`, you can use any name and provide more options preset:"webp-1x", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ resize:{ enabled:true, width:50, unit:"percent",}, encodeOptions:{ webp:{ quality:90,},},},},],}),],},};You can use your own generator implementation.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp",implementation:async(original, options)=>{const inputExt= path.extname(original.filename).toLowerCase();if(inputExt!==".xxx"){// Store error and return `null` if the implementation does not support this file type original.errors.push(error);returnnull;}let result;try{ result=awaitminifyAndReturnBuffer(original.data);}catch(error){// Store error and return `null` if there was an error original.errors.push(error);returnnull;}return{ filename: original.filename, data: result, warnings:[...original.warnings], errors:[...original.errors], info:{...original.info,// Please always set it to prevent double minification generated:true,// Optional generatedBy:["custom-name-of-minification"],},};}, options:{// Your options},},],}),],},};typeType:
typetype="import"|"asset"|undefined;Default:"import"
Allows you to apply the generator for eitherimport orassets from compilation (useful for copied assets).By default, generators are applying onimport/require, but sometimes you need to generate new images from other plugins (for example -copy-webpack-plugin).If you need this, please setasset value for thetype option.
webpack.config.js
const CopyPlugin=require("copy-webpack-plugin");const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},}, generator:[{// Apply generator for copied assets type:"asset",// You can use `ImageMinimizerPlugin.squooshGenerate`// You can use `ImageMinimizerPlugin.sharpGenerate` implementation: ImageMinimizerPlugin.imageminGenerate, options:{ plugins:["imagemin-webp"],},},],}),],}, plugins:[newCopyPlugin({ patterns:["images/**/*.png"]})],};presetType:
typepreset=string|undefined;Default:undefined
Configures the name of preset, i.e. you can use it in?as=name.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name",// Implementation implementation: ImageMinimizerPlugin.sharpMinify, options:{ encodeOptions:{ jpeg:{ quality:85,},},},},],}),],},};implementationType:
typeimplementation=( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;};Default:undefined
Configures the defaultimplementation.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name",// Implementation implementation: ImageMinimizerPlugin.sharpMinify, options:{ encodeOptions:{ jpeg:{ quality:85,},},},},],}),],},};optionsType:
typeoptions= Record<string,any>;Default:undefined
Options for theimplementation (i.e. options forimagemin/squoosh/sharp/custom implementation).
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name", implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},],}),],},};filterType:
typefilter=(source: Buffer, sourcePath:string)=>boolean;Default:() => true
Allows filtering of images for optimization/generation.
Returntrue to optimize the image, orfalse to skip it.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name",filter:(source, sourcePath)=>{// The `source` argument is a `Buffer` of the source file// The `sourcePath` argument is an absolute path to the sourceif(source.byteLength<8192){returnfalse;}returntrue;}, implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},],}),],},};filenameType:
typefilename=|string|(( pathData: PathData, assetInfo?:import("webpack").AssetInfo|undefined,)=>string);Default:undefined
Allows to set the filename.Supported values see inwebpack template strings, under theFile-level section.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name", filename:"generated-[name][ext]", implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},],}),],},};Example offunction usage:
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ generator:[{ preset:"name",filename:()=>"generated-[name][ext]", implementation: ImageMinimizerPlugin.sharpMinify,// Options options:{ encodeOptions:{ jpeg:{ quality:90,},},},},],}),],},};severityErrorType:
typeseverityError=string;Default:'error'
Allows to choose how errors are displayed during image optimization.
Сan have the following values:
'off' - Suppresses both errors and warnings'warning' - Emits warnings instead of errors'error' - Emits errorswebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ severityError:"warning", minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};loaderType:
typeloader=boolean;Default:true
Automatically adding built-inloader, used to optimize/generate images.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ loader:false,// `generator` will not work in this case minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};concurrencyType:
typeconcurrency=number;Default:Math.max(1, os.availableParallelism() - 1)
Maximum number of concurrency optimization processes in one time.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ concurrency:3, minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};deleteOriginalAssetsType:
typedeleteOriginalAssets=boolean;Default:true
Allows removing original assets after optimization.
Please use this option if you are set thefilename option for theminimizer option, disableloader: false and want to keep optimized and not optimized assets.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({// Disable loader loader:false,// Allows to keep original asset and minimized assets with different filenames deleteOriginalAssets:false, minimizer:{ filename:"[path][name].webp", implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},}),],},};minimizerType:
typeminimizer=|{ implementation:( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?: Record<string,any>|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}|{ implementation:( original:{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}, options?: Record<string,any>|undefined,)=>Promise<{ filename:string; data: Buffer; warnings: Error[]; errors: Error[]; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?: Record<string,any>|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}[];Default:undefined
Allows to setup default minimizer.
You can use either a single minimizer object or an array of them.
imageminwebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},{ test:/\.(jpe?g|png|gif|svg)$/i, loader: ImageMinimizerPlugin.loader, enforce:"pre", options:{ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},},},],},};For more information and supported options please readhere.
generatorType:
typegenerator={ implementation: TransformerFunction<T>; options?: BasicTransformerOptions<T>; filter?: FilterFn|undefined; filename?:string| FilenameFn|undefined; preset?:string|undefined;type?:"import"|"asset"|undefined;}[];Default:undefined
Allow to setup default generators.This is useful for creating new image formats (e.g., webp, avif, etc.) from existing images.
imageminThe following example demonstrates how to configure a generator that converts images to the webp format using imagemin.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},{ test:/\.(jpe?g|png|gif|svg)$/i, loader: ImageMinimizerPlugin.loader, enforce:"pre", options:{ generator:[{ preset:"webp", implementation: ImageMinimizerPlugin.imageminGenerate, options:{ plugins:["imagemin-webp"],},},],},},],},};This setup will automatically generate .webp versions of the original assets during the build process.For more information and supported options please readhere.
severityErrorType:
typeseverityError=string;Default:'error'
Allows to choose how errors are displayed during image optimization.
Сan have the following values:
'off' - Suppresses errors and warnings'warning' - Emits warnings instead errors'error' - Emits errorswebpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ module:{ rules:[{ test:/\.(jpe?g|png|gif|svg)$/i, type:"asset",},{ test:/\.(jpe?g|png|gif|svg)$/i, use:[{ loader: ImageMinimizerPlugin.loader, options:{ severityError:"warning", minimizerOptions:{ plugins:["gifsicle"],},},},],},],},};imageminNormalizeConfig(config)The function normalizes configuration (converts plugins names and options toFunctions) for using inimagemin package directly.
const{ imageminNormalizeConfig}=require("image-minimizer-webpack-plugin");const imagemin=require("imagemin");/* console.log(imageminConfig); => { plugins: [Function, Function], pluginsMeta: [ { name: "imagemin-jpegtran", version: "x.x.x", options: {} }, { name: "imagemin-pngquant", version: "x.x.x", options: { quality: [0.6, 0.8] } ] }*/const imageminConfig=awaitimageminNormalizeConfig({ plugins:["jpegtran",["pngquant",{ quality:[0.6,0.8]}]],});const files=awaitimagemin(["images/*.{jpg,png}"],{ destination:"build/images", plugins: imageminConfig.plugins,});console.log(files);// => [{data: <Buffer 89 50 4e …>, path: 'build/images/foo.jpg'}, …]You can use difference options (likeprogressive/interlaced/etc.) based on image size (example - don't do progressive transformation for small images).
What isprogressive image?Answer here.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:[newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:[["jpegtran",{ progressive:true}]],},// Only apply this one to files equal to or over 8192 bytesfilter:(source)=>{if(source.byteLength>=8192){returntrue;}returnfalse;},},}),newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:[["jpegtran",{ progressive:false}]],},// Only apply this one to files under 8192filter:(source)=>{if(source.byteLength<8192){returntrue;}returnfalse;},},}),],},};webp imagesYou can generate modern image formats likewebp alongside optimized originals using thegenerator option.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},}, generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.imageminGenerate, options:{ plugins:["imagemin-webp"],},},],}),],},};webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.squooshMinify,}, generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.squooshGenerate, options:{ encodeOptions:{ webp:{ quality:90,},},},},],}),],},};webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.sharpMinify,}, generator:[{// You can apply generator using `?as=webp`, you can use any name and provide more options preset:"webp", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ encodeOptions:{ webp:{ quality:90,},},},},],}),],},};webp images from copied assetsYou can use the generator feature to create modern image formats (likewebp) from static assets copied usingcopy-webpack-plugin.
webpack.config.js
const CopyPlugin=require("copy-webpack-plugin");const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},}, generator:[{ type:"asset", implementation: ImageMinimizerPlugin.imageminGenerate, options:{ plugins:["imagemin-webp"],},},],}),],}, plugins:[newCopyPlugin({ patterns:["images/**/*.png"]})],};webpack.config.js
const CopyPlugin=require("copy-webpack-plugin");const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.squooshMinify,}, generator:[{ type:"asset", implementation: ImageMinimizerPlugin.squooshGenerate, options:{ encodeOptions:{ webp:{ quality:90,},},},},],}),],}, plugins:[newCopyPlugin({ patterns:["images/**/*.png"]})],};webpack.config.js
const CopyPlugin=require("copy-webpack-plugin");const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ minimizer:{ implementation: ImageMinimizerPlugin.sharpMinify,}, generator:[{ type:"asset", implementation: ImageMinimizerPlugin.sharpGenerate, options:{ encodeOptions:{ webp:{ quality:90,},},},},],}),],}, plugins:[newCopyPlugin({ patterns:["images/**/*.png"]})],};We welcome contributions!If you’re interested in helping improve this plugin, please take a moment to read our contributing guidelines.