|
|
<div align="center"> |
|
|
<a href="https://github.com/webpack/webpack"> |
|
|
<img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg"> |
|
|
</a> |
|
|
</div> |
|
|
|
|
|
[![npm][npm]][npm-url] |
|
|
[![node][node]][node-url] |
|
|
[![deps][deps]][deps-url] |
|
|
[![tests][tests]][tests-url] |
|
|
[![cover][cover]][cover-url] |
|
|
[![chat][chat]][chat-url] |
|
|
[![size][size]][size-url] |
|
|
|
|
|
# css-minimizer-webpack-plugin |
|
|
|
|
|
This plugin uses [cssnano](https://cssnano.co) to optimize and minify your CSS. |
|
|
|
|
|
Just like [optimize-css-assets-webpack-plugin](https://github.com/NMFR/optimize-css-assets-webpack-plugin) but more accurate with source maps and assets using query string, allows caching and works in parallel mode. |
|
|
|
|
|
## Getting Started |
|
|
|
|
|
To begin, you'll need to install `css-minimizer-webpack-plugin`: |
|
|
|
|
|
```console |
|
|
$ npm install css-minimizer-webpack-plugin --save-dev |
|
|
``` |
|
|
|
|
|
Then add the plugin to your `webpack` configuration. For example: |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
|
|
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); |
|
|
|
|
|
module.exports = { |
|
|
module: { |
|
|
rules: [ |
|
|
{ |
|
|
test: /.s?css$/, |
|
|
use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], |
|
|
}, |
|
|
], |
|
|
}, |
|
|
optimization: { |
|
|
minimizer: [ |
|
|
// For webpack@5 you can use the `...` syntax to extend existing minimizers (i.e. `terser-webpack-plugin`), uncomment the next line |
|
|
// `...`, |
|
|
new CssMinimizerPlugin(), |
|
|
], |
|
|
}, |
|
|
plugins: [new MiniCssExtractPlugin()], |
|
|
}; |
|
|
``` |
|
|
|
|
|
This will enable CSS optimization only in production mode. |
|
|
|
|
|
If you want to run it also in development set the `optimization.minimize` option to `true`: |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
// [...] |
|
|
module.exports = { |
|
|
optimization: { |
|
|
// [...] |
|
|
minimize: true, |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
And run `webpack` via your preferred method. |
|
|
|
|
|
## Note about source maps |
|
|
|
|
|
**Works only with `source-map`, `inline-source-map`, `hidden-source-map` and `nosources-source-map` values for the [`devtool`](https://webpack.js.org/configuration/devtool/) option.** |
|
|
|
|
|
Why? Because CSS support only these source map types. |
|
|
|
|
|
The plugin respect the [`devtool`](https://webpack.js.org/configuration/devtool/) and using the `SourceMapDevToolPlugin` plugin. |
|
|
Using supported `devtool` values enable source map generation. |
|
|
Using `SourceMapDevToolPlugin` with enabled the `columns` option enables source map generation. |
|
|
|
|
|
Use source maps to map error message locations to modules (this slows down the compilation). |
|
|
If you use your own `minify` function please read the `minify` section for handling source maps correctly. |
|
|
|
|
|
## Options |
|
|
|
|
|
| Name | Type | Default | Description | |
|
|
| :-----------------------------------------: | :--------------------------------------------: | :--------------------------------: | :---------------------------------------------------------------------- | |
|
|
| **[`test`](#test)** | `String\|RegExp\|Array<String\|RegExp>` | `/\.css(\?.*)?$/i` | Test to match files against. | |
|
|
| **[`include`](#include)** | `String\|RegExp\|Array<String\|RegExp>` | `undefined` | Files to include. | |
|
|
| **[`exclude`](#exclude)** | `String\|RegExp\|Array<String\|RegExp>` | `undefined` | Files to exclude. | |
|
|
| **[`parallel`](#parallel)** | `Boolean\|Number` | `true` | Enable/disable multi-process parallel running. | |
|
|
| **[`minify`](#minify)** | `Function\|Array<Function>` | `CssMinimizerPlugin.cssnanoMinify` | Allows to override default minify function. | |
|
|
| **[`minimizerOptions`](#minimizeroptions)** | `Object\|Array<Object>` | `{ preset: 'default' }` | Cssnano optimisations [options](https://cssnano.co/docs/optimisations). | |
|
|
| **[`warningsFilter`](#warningsfilter)** | `Function<(warning, file, source) -> Boolean>` | `() => true` | Allow to filter css-minimizer warnings. | |
|
|
|
|
|
### `test` |
|
|
|
|
|
Type: `String|RegExp|Array<String|RegExp>` - default: `/\.css(\?.*)?$/i` |
|
|
|
|
|
Test to match files against. |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
test: /\.foo\.css$/i, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `include` |
|
|
|
|
|
Type: `String|RegExp|Array<String|RegExp>` |
|
|
Default: `undefined` |
|
|
|
|
|
Files to include. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
include: /\/includes/, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `exclude` |
|
|
|
|
|
Type: `String|RegExp|Array<String|RegExp>` |
|
|
Default: `undefined` |
|
|
|
|
|
Files to exclude. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
exclude: /\/excludes/, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `parallel` |
|
|
|
|
|
Type: `Boolean|Number` |
|
|
Default: `true` |
|
|
|
|
|
Use multi-process parallel running to improve the build speed. |
|
|
Default number of concurrent runs: `os.cpus().length - 1`. |
|
|
|
|
|
> ℹ️ Parallelization can speed up your build significantly and is therefore **highly recommended**. |
|
|
> If a parallelization is enabled, the packages in `minimizerOptions` must be required via strings (`packageName` or `require.resolve(packageName)`). Read more in [`minimizerOptions`](#minimizeroptions) |
|
|
|
|
|
#### `Boolean` |
|
|
|
|
|
Enable/disable multi-process parallel running. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
parallel: true, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
#### `Number` |
|
|
|
|
|
Enable multi-process parallel running and set number of concurrent runs. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
parallel: 4, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `minify` |
|
|
|
|
|
Type: `Function|Array<Function>` |
|
|
Default: `CssMinimizerPlugin.cssnanoMinify` |
|
|
|
|
|
Allows overriding default minify function. |
|
|
By default, plugin uses [cssnano](https://github.com/cssnano/cssnano) package. |
|
|
Useful for using and testing unpublished versions or forks. |
|
|
|
|
|
Possible options: |
|
|
|
|
|
- CssMinimizerPlugin.cssnanoMinify |
|
|
- CssMinimizerPlugin.cssoMinify |
|
|
- CssMinimizerPlugin.cleanCssMinify |
|
|
- CssMinimizerPlugin.esbuildMinify |
|
|
- CssMinimizerPlugin.parcelCssMinify |
|
|
- `async (data, inputMap, minimizerOptions) => {return {code: "a{color: red}", map: "...", warnings: [], errors: []}}` |
|
|
|
|
|
> ⚠️ **Always use `require` inside `minify` function when `parallel` option enabled**. |
|
|
|
|
|
#### `Function` |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: { |
|
|
level: { |
|
|
1: { |
|
|
roundingPrecision: "all=3,px=5", |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
minify: CssMinimizerPlugin.cleanCssMinify, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
#### `Array` |
|
|
|
|
|
If an array of functions is passed to the `minify` option, the `minimizerOptions` must also be an array. |
|
|
The function index in the `minify` array corresponds to the options object with the same index in the `minimizerOptions` array. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: [ |
|
|
{}, // Options for the first function (CssMinimizerPlugin.cssnanoMinify) |
|
|
{}, // Options for the second function (CssMinimizerPlugin.cleanCssMinify) |
|
|
{}, // Options for the third function |
|
|
], |
|
|
minify: [ |
|
|
CssMinimizerPlugin.cssnanoMinify, |
|
|
CssMinimizerPlugin.cleanCssMinify, |
|
|
async (data, inputMap, minimizerOptions) => { |
|
|
// To do something |
|
|
return { |
|
|
code: `a{color: red}`, |
|
|
map: `{"version": "3", ...}`, |
|
|
warnings: [], |
|
|
errors: [], |
|
|
}; |
|
|
}, |
|
|
], |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `minimizerOptions` |
|
|
|
|
|
Type: `Object|Array<Object>` |
|
|
Default: `{ preset: 'default' }` |
|
|
|
|
|
Cssnano optimisations [options](https://cssnano.co/docs/optimisations). |
|
|
|
|
|
#### `Object` |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: { |
|
|
preset: [ |
|
|
"default", |
|
|
{ |
|
|
discardComments: { removeAll: true }, |
|
|
}, |
|
|
], |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
#### `Array` |
|
|
|
|
|
The function index in the `minify` array corresponds to the options object with the same index in the `minimizerOptions` array. |
|
|
If you use `minimizerOptions` like object, all `minify` function accept it. |
|
|
|
|
|
> If a parallelization is enabled, the packages in `minimizerOptions` must be required via strings (`packageName` or `require.resolve(packageName)`). In this case, we shouldn't use `require`/`import`. |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: { |
|
|
preset: require.resolve("cssnano-preset-simple"), |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
##### `processorOptions` (⚠ only cssnano) |
|
|
|
|
|
Type: `Object` |
|
|
Default: `{ from: assetName }` |
|
|
|
|
|
Allows filtering options [`processoptions`](https://postcss.org/api/#processoptions) for the cssnano. |
|
|
The `parser`,` stringifier` and `syntax` can be either a function or a string indicating the module that will be imported. |
|
|
|
|
|
> ⚠️ **If a function is passed, the `parallel` option must be disabled.**. |
|
|
|
|
|
```js |
|
|
import sugarss from "sugarss"; |
|
|
|
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
parallel: false, |
|
|
minimizerOptions: { |
|
|
processorOptions: { |
|
|
parser: sugarss, |
|
|
}, |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: { |
|
|
processorOptions: { |
|
|
parser: "sugarss", |
|
|
}, |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### `warningsFilter` |
|
|
|
|
|
Type: `Function<(warning, file, source) -> Boolean>` |
|
|
Default: `() => true` |
|
|
|
|
|
Allow filtering css-minimizer warnings (By default [cssnano](https://github.com/cssnano/cssnano)). |
|
|
Return `true` to keep the warning, a falsy value (`false`/`null`/`undefined`) otherwise. |
|
|
|
|
|
> ⚠️ The `source` argument will contain `undefined` if you don't use source maps. |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
warningsFilter: (warning, file, source) => { |
|
|
if (/Dropping unreachable code/i.test(warning)) { |
|
|
return true; |
|
|
} |
|
|
|
|
|
if (/file\.css/i.test(file)) { |
|
|
return true; |
|
|
} |
|
|
|
|
|
if (/source\.css/i.test(source)) { |
|
|
return true; |
|
|
} |
|
|
|
|
|
return false; |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
## Examples |
|
|
|
|
|
### Use sourcemaps |
|
|
|
|
|
Don't forget to enable `sourceMap` options for all loaders. |
|
|
|
|
|
```js |
|
|
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); |
|
|
|
|
|
module.exports = { |
|
|
devtool: "source-map", |
|
|
module: { |
|
|
rules: [ |
|
|
{ |
|
|
test: /.s?css$/, |
|
|
use: [ |
|
|
MiniCssExtractPlugin.loader, |
|
|
{ loader: "css-loader", options: { sourceMap: true } }, |
|
|
{ loader: "sass-loader", options: { sourceMap: true } }, |
|
|
], |
|
|
}, |
|
|
], |
|
|
}, |
|
|
optimization: { |
|
|
minimizer: [new CssMinimizerPlugin()], |
|
|
}, |
|
|
plugins: [new MiniCssExtractPlugin()], |
|
|
}; |
|
|
``` |
|
|
|
|
|
### Remove all comments |
|
|
|
|
|
Remove all comments (including comments starting with `/*!`). |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
optimization: { |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minimizerOptions: { |
|
|
preset: [ |
|
|
"default", |
|
|
{ |
|
|
discardComments: { removeAll: true }, |
|
|
}, |
|
|
], |
|
|
}, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### Using custom minifier [csso](https://github.com/css/csso) |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
// Uncomment if you need source maps |
|
|
// devtool: "source-map", |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minify: CssMinimizerPlugin.cssoMinify, |
|
|
// Uncomment this line for options |
|
|
// minimizerOptions: { restructure: false }, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### Using custom minifier [clean-css](https://github.com/jakubpawlowicz/clean-css) |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
// Uncomment if you need source maps |
|
|
// devtool: "source-map", |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minify: CssMinimizerPlugin.cleanCssMinify, |
|
|
// Uncomment this line for options |
|
|
// minimizerOptions: { compatibility: 'ie11,-properties.merging' }, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### Using custom minifier [esbuild](https://github.com/evanw/esbuild) |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
// Uncomment if you need source maps |
|
|
// devtool: "source-map", |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minify: CssMinimizerPlugin.esbuildMinify, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
### Using custom minifier [@parcel/css](https://github.com/parcel-bundler/parcel-css) |
|
|
|
|
|
**webpack.config.js** |
|
|
|
|
|
```js |
|
|
module.exports = { |
|
|
// Uncomment if you need source maps |
|
|
// devtool: "source-map", |
|
|
optimization: { |
|
|
minimize: true, |
|
|
minimizer: [ |
|
|
new CssMinimizerPlugin({ |
|
|
minify: CssMinimizerPlugin.parcelCssMinify, |
|
|
// Uncomment this line for options |
|
|
// minimizerOptions: { targets: { ie: 11 }, drafts: { nesting: true } }, |
|
|
}), |
|
|
], |
|
|
}, |
|
|
}; |
|
|
``` |
|
|
|
|
|
## Contributing |
|
|
|
|
|
Please take a moment to read our contributing guidelines if you haven't yet done so. |
|
|
|
|
|
[CONTRIBUTING](./.github/CONTRIBUTING.md) |
|
|
|
|
|
## License |
|
|
|
|
|
[MIT](./LICENSE) |
|
|
|
|
|
[npm]: https://img.shields.io/npm/v/css-minimizer-webpack-plugin.svg |
|
|
[npm-url]: https://npmjs.com/package/css-minimizer-webpack-plugin |
|
|
[node]: https://img.shields.io/node/v/css-minimizer-webpack-plugin.svg |
|
|
[node-url]: https://nodejs.org |
|
|
[deps]: https://david-dm.org/webpack-contrib/css-minimizer-webpack-plugin.svg |
|
|
[deps-url]: https://david-dm.org/webpack-contrib/css-minimizer-webpack-plugin |
|
|
[tests]: https://github.com/webpack-contrib/css-minimizer-webpack-plugin/workflows/css-minimizer-webpack-plugin/badge.svg |
|
|
[tests-url]: https://github.com/webpack-contrib/css-minimizer-webpack-plugin/actions |
|
|
[cover]: https://codecov.io/gh/webpack-contrib/css-minimizer-webpack-plugin/branch/master/graph/badge.svg |
|
|
[cover-url]: https://codecov.io/gh/webpack-contrib/css-minimizer-webpack-plugin |
|
|
[chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg |
|
|
[chat-url]: https://gitter.im/webpack/webpack |
|
|
[size]: https://packagephobia.now.sh/badge?p=css-minimizer-webpack-plugin |
|
|
[size-url]: https://packagephobia.now.sh/result?p=css-minimizer-webpack-plugin
|
|
|
|