@vheemstra/vite-plugin-imagemin
Version:
A vite plugin for compressing image assets
257 lines (179 loc) • 10.1 kB
Markdown
<h1 align="center">
<a target="_blank" rel="noopener noreferrer" href="https://github.com/vHeemstra/vite-plugin-imagemin/blob/main/packages/core/src/logo.svg?raw=true"><img src="https://github.com/vHeemstra/vite-plugin-imagemin/raw/main/packages/core/src/logo.svg?raw=true" alt="vite-plugin-imagemin - Vite + Imagemin" title="vite-plugin-imagemin - Vite + Imagemin" style="width: 75%; min-width: 280px; max-width: 800px; height: auto"></a><br>
[![GitHub release (latest SemVer)][release-image]][release-url] [![NPM version][npm-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coverall Coverage Status][coverage-image]][coverage-url]
</h1>
> Minify bundled asset and static images in your Vite build with **Imagemin**.
> It optimizes all images you want, with the plugins you pick, using the configuration you choose.
## Features
- Supports all Imagemin-* plugins.
- Full control over:
- which plugin(s) to use
- what options to apply
- which files to process
- output files' path and name
- Can create WebP versions of supported images (jpg/png/gif).
- Can create Avif versions of supported images (jpg/png).
- Skips optimized version if output is larger than original.
- Skips Avif/WebP version if output is larger than original, optimized version or smallest version of an image.
## Install
```sh
npm install @vheemstra/vite-plugin-imagemin --save-dev
```
You also need to install the minifier plugins you want to use.
## Usage
Add **vite-plugin-imagemin** and the minifier plugins to your `vite.config.js`:
```js
// vite.config.js
import { defineConfig } from 'vite'
import viteImagemin from '@vheemstra/vite-plugin-imagemin'
// The minifiers you want to use:
import imageminMozjpeg from 'imagemin-mozjpeg'
import imageminWebp from 'imagemin-webp'
export default defineConfig({
// ...your Vite config
plugins: [
// ...your other plugins
viteImagemin({
plugins: {
jpg: imageminMozjpeg(),
},
makeWebp: {
plugins: {
jpg: imageminWebp(),
},
},
}),
],
})
```
## Options
### plugins <sup>`required`</sup>
Type: `object`<br>
> Object containing the minifiers to use per file extension, where:
>
> - `key` is the file extension<br>_Side note: `jpg` matches `.jpg` and `.jpeg` files._
> - `value` is the initiated minifier plugin (or array of plugins)
>
> All **imagemin-*** plugins can be used. See their documentation for install instructions and options.
> See also [Suggested minifier plugins](#suggested-minifier-plugins).
### onlyAssets
Type: `boolean`<br>
Default: `false`
> Process only files in project's **assets** folder (`true`) or process all files in project's **dist** folder (`false`).
### include
Type: `String | RegExp | Array[...String|RegExp]`<br>
Default: `/\.(png|jpg|jpeg|gif|svg)$/i`
> Valid [**picomatch**](https://github.com/micromatch/picomatch#globbing-features) pattern to include image files to minify (used in [`createFilter`](https://vitejs.dev/guide/api-plugin.html#filtering-include-exclude-pattern)).
### exclude
Type: `String | RegExp | Array[...String|RegExp]`<br>
Default: `/node_modules/`
> Valid [**picomatch**](https://github.com/micromatch/picomatch#globbing-features) pattern to exclude files from processing (used in [`createFilter`](https://vitejs.dev/guide/api-plugin.html#filtering-include-exclude-pattern)).
### formatFilePath
Type: `function`<br>
Default: `(file: string) => file`
> Callback function to change the output filepath, defaults to overwriting the original file.<br>The **file** argument holds the input filepath relative to the project's **root** directory (e.g. `dist/assets/image.jpg`).
### skipIfLarger
Type: `boolean`<br>
Default: `true`
> Ignore the optimized output if it is larger than the original file.
### makeAvif / makeWebp
Type: `object`<br>
Default: `undefined`
> Opt-in to create additional Avif and/or WebP versions of the processed images.
#### make*.plugins <sup>`required`</sup>
Type: `object`<br>
> Same as [**options.plugins**](#plugins-required).
#### make*.formatFilePath
Type: `function`<br>
Default: <code>(file: string) => \`${file}.avif\`</code>
> Like [**options.formatFilePath**](#formatfilepath), but by default the `.avif`/`.webp` extension is appended to the filepath.<br>The **file** argument holds the filepath as produced by `options.formatFilePath`.
#### make*.skipIfLargerThan
Type: `false | 'original' | 'optimized' | 'smallest'`<br>
Default: `'optimized'`
> Skip Avif/WebP version if:
> - larger than the original image (`'original'`)
> - larger than the optimized image (`'optimized'`)
> - it is not the smallest version of the image (`'smallest'`)
> - never skip (`false`)
### root
Type: `string`<br>
Default: Vite's [`resolvedConfig.root`](https://vitejs.dev/guide/api-plugin.html#configresolved) or current working directory
> Path to project root directory.
### verbose
Type: `boolean`<br>
Default: `true`
> Whether to log process results to console.
### logger
Type: `object | Logger`<br>
Default: Vite's [`resolvedConfig.logger`](https://vitejs.dev/guide/api-plugin.html#configresolved)
> Logger object with callback functions on the `info`, `warn` and `error` keys.
### logByteDivider
Type: `number`<br>
Default: `1000`
> Choose the size format to use in the logs:
> - `1000` displays size in kilobytes (kB)
> - `1024` displays size in kibibytes (KiB)
## Suggested minifier plugins
#### Optimize plugins
| Plugin | Recommended | Type | Options |
| ------------- |:-------:| ------- | ------- |
| **imagemin-gifsicle** | ✅ | GIF | see [docs](https://github.com/imagemin/imagemin-gifsicle#options) |
| **imagemin-mozjpeg** | ✅ | JPG | see [docs](https://github.com/imagemin/imagemin-mozjpeg#options) |
| **imagemin-jpegoptim** | | JPG | see [docs](https://github.com/imagemin/imagemin-jpegoptim#options) |
| **imagemin-jpegtran** | | JPG | see [docs](https://github.com/imagemin/imagemin-jpegtran#options) |
| **imagemin-pngquant** | ✅ | PNG | see [docs](https://github.com/imagemin/imagemin-pngquant#options) |
| **imagemin-optipng** | | PNG | see [docs](https://github.com/imagemin/imagemin-optipng#options) |
| **imagemin-svgo** | ✅ | SVG | see [docs](https://github.com/svg/svgo#configuration) |
#### Make plugins
| Plugin | Types | Options |
| ------------- | ------- | ------- |
| **imagemin-webp** | JPG / PNG | see [docs](https://github.com/imagemin/imagemin-webp#options) |
| **imagemin-gif2webp** | GIF | see [docs](https://github.com/imagemin/imagemin-gif2webp#options) |
| **@vheemstra/imagemin-avifenc** | JPG / PNG | see [docs](https://github.com/vHeemstra/imagemin-avifenc/#options) |
Additional created versions can be delivered by the server if the client supports its format (see example config below). If not, the original (optimized) image can be delivered.
**_Tip_**:
Use [**skipIfLargerThan**](#makeskipiflargerthan) option to ensure additional versions of images are smaller than the regular ones. (Otherwise, what was the point... :wink:)
#### Example `.htaccess` config for WebP
```apache
<IfModule mod_rewrite.c>
RewriteEngine On
# If browser supports WebP images...
RewriteCond %{HTTP_ACCEPT} image/webp
# ...and WebP replacement image exists in the same directory...
RewriteCond %{REQUEST_FILENAME}.webp -f
# ...serve WebP image instead of jpeg/png/gif.
RewriteRule (.+)\.(jpe?g|png|gif)$ $1.webp [T=image/webp,E=REQUEST_image]
</IfModule>
<IfModule mod_headers.c>
# Vary: Accept for all the requests to jpeg, png and gif
Header append Vary Accept env=REQUEST_image
</IfModule>
<IfModule mod_mime.c>
# Add file type MIME support
AddType image/webp .webp
</IfModule>
```
_Adopted from answers given [here](https://stackoverflow.com/a/68967381/2142071)._
## License
[MIT](LICENSE)
## Related
- [Vite](https://github.com/vitejs/vite)
- [imagemin](https://github.com/imagemin/imagemin)
- [imagemin-jpegtran](https://github.com/imagemin/imagemin-jpegtran)
- [imagemin-mozjpeg](https://github.com/imagemin/imagemin-mozjpeg)
- [imagemin-jpegoptim](https://github.com/imagemin/imagemin-jpegoptim)
- [imagemin-pngquant](https://github.com/imagemin/imagemin-pngquant)
- [imagemin-optipng](https://github.com/imagemin/imagemin-optipng)
- [imagemin-gifsicle](https://github.com/imagemin/imagemin-gifsicle)
- [imagemin-svgo](https://github.com/imagemin/imagemin-svgo)
- [imagemin-webp](https://github.com/imagemin/imagemin-webp)
- [imagemin-gif2webp](https://github.com/imagemin/imagemin-gif2webp)
- [@vheemstra/imagemin-avifenc](https://github.com/vHeemstra/imagemin-avifenc)
[release-url]: https://github.com/vHeemstra/vite-plugin-imagemin/releases
[release-image]: https://img.shields.io/github/v/release/vHeemstra/vite-plugin-imagemin?sort=semver&logo=github&logoColor=959DA5&labelColor=444D56
[npm-url]: https://www.npmjs.com/package/@vheemstra/vite-plugin-imagemin
[npm-image]: https://img.shields.io/npm/v/@vheemstra/vite-plugin-imagemin.svg?color=cb0000&labelColor=444D56&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjOTU5REE1IiBkPSJNMS43NjMgMEMuNzg2IDAgMCAuNzg2IDAgMS43NjN2MjAuNDc0QzAgMjMuMjE0Ljc4NiAyNCAxLjc2MyAyNGgyMC40NzRjLjk3NyAwIDEuNzYzLS43ODYgMS43NjMtMS43NjNWMS43NjNDMjQgLjc4NiAyMy4yMTQgMCAyMi4yMzcgMHpNNS4xMyA1LjMyM2wxMy44MzcuMDE5LS4wMDkgMTMuODM2aC0zLjQ2NGwuMDEtMTAuMzgyaC0zLjQ1NkwxMi4wNCAxOS4xN0g1LjExM3oiPjwvcGF0aD48L3N2Zz4=
[ci-url]: https://github.com/vHeemstra/vite-plugin-imagemin/actions/workflows/publish_on_release.yml
[ci-image]: https://img.shields.io/github/actions/workflow/status/vHeemstra/vite-plugin-imagemin/publish_on_release.yml?label=lint%20%26%20test&logo=github&logoColor=959DA5&labelColor=444D56
[coverage-url]: https://coveralls.io/github/vHeemstra/vite-plugin-imagemin
[coverage-image]: https://img.shields.io/coveralls/github/vHeemstra/vite-plugin-imagemin?logo=coveralls&logoColor=959DA5&labelColor=444D56