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-dev
npm install image-minimizer-webpack-plugin sharp --save-dev
svgo
:npm install image-minimizer-webpack-plugin svgo --save-dev
Images 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-dev
Recommendedimagemin
plugins for lossy optimization
npminstall imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-dev
Forimagemin-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"},],},},},},},],},],],},},}),],},};
squoosh
npm install @squoosh/lib --save-dev
Recommended@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,},},},},}),],},};
sharp
npm install sharp --save-dev
Recommendedsharp
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:{},},},},}),],},};
svgo
npm install svgo --save-dev
Recommendedsvgo
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
avif
andwebp
presets, 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`}),],},};
test
Type:
typetest=string| RegExp|Array<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,}),],},};
include
Type:
typeinclude=string| RegExp|Array<string| RegExp>;
Default:undefined
Files to include.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ include:/\/includes/,}),],},};
exclude
Type:
typeexclude=string| RegExp|Array<string| RegExp>;
Default:undefined
Files to exclude.
webpack.config.js
const ImageMinimizerPlugin=require("image-minimizer-webpack-plugin");module.exports={ optimization:{ minimizer:["...",newImageMinimizerPlugin({ exclude:/\/excludes/,}),],},};
minimizer
Type:
typeminimizer=|{ implementation:( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?:|{[key:string]:any;}|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}|Array<{ implementation:( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?:|{[key: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.imageminMinify
ImageMinimizerPlugin.squooshMinify
ImageMinimizerPlugin.sharpMinify
ImageMinimizerPlugin.svgoMinify
imagemin
webpack.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.
squoosh
webpack.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.
sharp
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,},},},},}),],},};
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",],},},},],}),],},};
implementation
Type:
typeimplementation=( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?: BasicTransformerOptions<T>,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<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,},},},},}),],},};
options
Type:
typeoptions={[key: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,},},},},}),],},};
filter
Type:
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",],},},}),],},};
filename
Type:
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,},},},},}),],},};
generator
Type:
typegenerator=Array<{ implementation:( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?:|{[key: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=webp
was found in query params), theminimizer
option 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 theloader
option tofalse
).
ImageMinimizerPlugin.imageminGenerate
ImageMinimizerPlugin.squooshGenerate
ImageMinimizerPlugin.sharpGenerate
imagemin
Examplewebp
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"],},},],}),],},};
squoosh
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.squooshGenerate, options:{ encodeOptions:{// Please specify only one codec here, multiple codecs will not work webp:{ quality:90,},},},},],}),],},};
sharp
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:{// 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},},],}),],},};
type
Type:
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"]})],};
preset
Type:
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,},},},},],}),],},};
implementation
Type:
typeimplementation=( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<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,},},},},],}),],},};
options
Type:
typeoptions={[key: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,},},},},],}),],},};
filter
Type:
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",],},},],}),],},};
filename
Type:
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,},},},},],}),],},};
severityError
Type:
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",],},},}),],},};
loader
Type:
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",],},},}),],},};
concurrency
Type:
typeconcurrency=number;
Default:Math.max(1, os.cpus().length - 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",],},},}),],},};
deleteOriginalAssets
Type:
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",],},},}),],},};
minimizer
Type:
typeminimizer=|{ implementation:( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?:|{[key:string]:any;}|undefined; filter?:(source: Buffer, sourcePath:string)=>boolean|undefined; filename?:|string|(( pathData:{ filename?:string|undefined;}, assetInfo?:import("webpack").AssetInfo|undefined,)=>string)|undefined;}|Array<{ implementation:( original:{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}, options?:|{[key:string]:any;}|undefined,)=>Promise<{ filename:string; data: Buffer; warnings:Array<Error>; errors:Array<Error>; info:import("webpack").AssetInfo;}>&{ setup?:(()=>void)|undefined; teardown?:(()=>void)|undefined;}; options?:|{[key: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.
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:{ minimizer:{ implementation: ImageMinimizerPlugin.imageminMinify, options:{ plugins:["imagemin-gifsicle","imagemin-mozjpeg","imagemin-pngquant","imagemin-svgo",],},},},},],},};
For more information and supported options please readhere.
generator
Type:
typegenerator=Array<{ 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.
imagemin
The 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.
severityError
Type:
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 toFunction
s) for using inimagemin
package directly.
const imagemin=require("imagemin");const{ imageminNormalizeConfig}=require("image-minimizer-webpack-plugin");/* 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] } ] }*/(async()=>{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.