è¿ä¸ªæä»¶ä½¿ç¨ cssnano ä¼ååå缩 CSSã
å°±å optimize-css-assets-webpack-plugin 䏿 ·ï¼ä½å¨ source maps å assets ä¸ä½¿ç¨æ¥è¯¢åç¬¦ä¸²ä¼æ´å åç¡®ï¼æ¯æç¼åå并忍¡å¼ä¸è¿è¡ã
é¦å
ï¼ä½ éè¦å®è£
css-minimizer-webpack-pluginï¼
npm install css-minimizer-webpack-plugin --save-dev
æ¥çå¨ webpack é
ç½®ä¸å å
¥è¯¥æä»¶ã示ä¾ï¼
webpack.config.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: [
// å¨ webpack@5 ä¸ï¼ä½ å¯ä»¥ä½¿ç¨ `...` è¯æ³æ¥æ©å±ç°æç minimizerï¼å³ `terser-webpack-plugin`ï¼ï¼å°ä¸ä¸è¡åæ¶æ³¨é
// `...`,
new CssMinimizerPlugin(),
],
},
plugins: [new MiniCssExtractPlugin()],
};è¿å°ä» å¨ç产ç¯å¢å¼å¯ CSS ä¼åã
å¦æè¿æ³å¨å¼åç¯å¢ä¸å¯ç¨ CSS ä¼åï¼è¯·å° optimization.minimize 设置为 true:
webpack.config.js
// [...]
module.exports = {
optimization: {
// [...]
minimize: true,
},
};ç¶åéè¿ä½ 忬¢çæ¹å¼è¿è¡ webpackã
ä»
对 devtool é
置项ç source-mapãinline-source-mapãhidden-source-map ä¸ nosources-source-map å¼çæã
为ä»ä¹å¢ï¼å 为 CSS ä» æ¯æè¿äº source map ç±»åã
æä»¶æ¯æ devtool å¹¶ä¸ä½¿ç¨ SourceMapDevToolPlugin æä»¶ã
使ç¨åæ¯æç devtool å¼å¯ä»¥å¯ç¨ source map çæã
ä½¿ç¨ SourceMapDevToolPlugin å¹¶å¯ç¨ columns é
置项å¯ä»¥å¯ç¨ source map çæã
ä½¿ç¨ source map å°é误信æ¯ä½ç½®æ å°å° modules ä¸ï¼è¿éä½äºå¤æåº¦ï¼ã
å¦æä½ æ¯ç¨èªå®ä¹ minify 彿°ï¼è¯·é
读 minify ç« èä»¥ç¡®ä¿æ£ç¡®å¤ç source mapã
| é项å | ç±»å | é»è®¤å¼ | æè¿° |
|---|---|---|---|
test | String|RegExp|Array<String|RegExp> | /\.css(\?.*)?$/i | å¹é è¦å¤ççæä»¶ |
include | String|RegExp|Array<String|RegExp> | undefined | è¦å¼å ¥çæä»¶ |
exclude | String|RegExp|Array<String|RegExp> | undefined | è¦æé¤çæä»¶ |
parallel | Boolean|Number | true | å¯ç¨/ç¦ç¨å¤è¿ç¨å¹¶è¡å¤çã |
minify | Function|Array<Function> | CssMinimizerPlugin.cssnanoMinify | å 许è¦çé»è®¤ç minify 彿°ã |
minimizerOptions | Object|Array<Object> | { preset: 'default' } | Cssnano ä¼å é 置项ã |
warningsFilter | Function<(warning, file, source) -> Boolean> | () => true | å è®¸è¿æ»¤æ css-minimizer çè¦åã |
testç±»åï¼String|RegExp|Array<String|RegExp> - é»è®¤å¼ï¼/\.css(\?.*)?$/i
ç¨æ¥å¹é æä»¶ã
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
test: /\.foo\.css$/i,
}),
],
},
};includeç±»åï¼String|RegExp|Array<String|RegExp>
é»è®¤å¼ï¼undefined
è¦å å«çæä»¶ã
webpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
include: /\/includes/,
}),
],
},
};excludeç±»åï¼String|RegExp|Array<String|RegExp>
é»è®¤å¼ï¼undefined
è¦æé¤çæä»¶ã
webpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
exclude: /\/excludes/,
}),
],
},
};parallelç±»åï¼Boolean|Number
é»è®¤å¼ï¼true
使ç¨å¤è¿ç¨å¹¶åæ§è¡ï¼æåæå»ºé度ã
è¿è¡æ¶é»è®¤çå¹¶åæ°ï¼os.cpus().length - 1ã
â¹ï¸ å¹¶è¡åå¯ä»¥æ¾èæåæå»ºéåº¦ï¼æä»¥å¼ºç建议使ç¨ã 妿å¯ç¨äºå¹¶è¡åï¼
minimizerOptionsä¸çå å¿ é¡»éè¿å符串å¼å ¥ï¼packageNameæèrequire.resolve(packageName)ï¼ãå¨minimizerOptionsè·åæ´å¤è¯¦ç»ä¿¡æ¯ã
Booleanå¯ç¨/ç¦ç¨å¤è¿ç¨å¹¶åæ§è¡ã
webpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
parallel: true,
}),
],
},
};Numberå¯ç¨å¤è¿ç¨å¹¶åæ§è¡ä¸è®¾ç½®å¹¶åæ°ã
webpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
parallel: 4,
}),
],
},
};minifyç±»åï¼Function|Array<Function>
é»è®¤å¼ï¼CssMinimizerPlugin.cssnanoMinify
å 许è¦çé»è®¤ç minify 彿°ã é»è®¤æ åµä¸ï¼æä»¶ä½¿ç¨ cssnano å ã 对äºä½¿ç¨åæµè¯æªåå¸æçæ¬è¡ççæ¬å¾æç¨ã
å¯éé ç½®ï¼
async (data, inputMap, minimizerOptions) => {return {code: "a{color: red}", map: "...", warnings: [], errors: []}}â ï¸ å¯ç¨
parallelé项æ¶ï¼å§ç»å¨minify彿°ä¸ä½¿ç¨requireã
Functionwebpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: {
level: {
1: {
roundingPrecision: 'all=3,px=5',
},
},
},
minify: CssMinimizerPlugin.cleanCssMinify,
}),
],
},
};Array妿 minify é
ç½®é¡¹ä¼ å
¥ä¸ä¸ªæ°ç»ï¼minimizerOptions ä¹å¿
é¡»æ¯ä¸ªæ°ç»ã
miniify æ°ç»ä¸ç彿°ç´¢å¼å¯¹åºäº minimizerOptions æ°ç»ä¸å
·æç¸åç´¢å¼ç options 对象ã
webpack.config.js
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: [
{}, // 第ä¸ä¸ªå½æ°çé
置项ï¼CssMinimizerPlugin.cssnanoMinifyï¼
{}, // 第äºä¸ªå½æ°çé
置项ï¼CssMinimizerPlugin.cleanCssMinifyï¼
{}, // 第ä¸ä¸ªå½æ°çé
置项
],
minify: [
CssMinimizerPlugin.cssnanoMinify,
CssMinimizerPlugin.cleanCssMinify,
async (data, inputMap, minimizerOptions) => {
// To do something
return {
code: `a{color: red}`,
map: `{"version": "3", ...}`,
warnings: [],
errors: [],
};
},
],
}),
],
},
};minimizerOptionsç±»åï¼Object|Array<Object>
é»è®¤å¼ï¼{ preset: 'default' }
Cssnano ä¼å é项.
Objectmodule.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: {
preset: [
'default',
{
discardComments: { removeAll: true },
},
],
},
}),
],
},
};Arrayminiify æ°ç»ä¸ç彿°ç´¢å¼å¯¹åºäº minimizerOptions æ°ç»ä¸å
·æç¸åç´¢å¼ç options 对象ã
å¦æä½ ä½¿ç¨äºç±»ä¼¼äº minimizerOptions ç对象ï¼é£ä¹ææå½æ°é½ä¼æ¥åå®ã
妿å¯ç¨äºå¹¶è¡åï¼
minimizerOptionsä¸çå å¿ é¡»éè¿å符串å¼å ¥ï¼packageNameæèrequire.resolve(packageName)ï¼ãå¨è¿ç§æ åµä¸ï¼æä»¬ä¸åºè¯¥ä½¿ç¨require/importã
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: {
preset: require.resolve('cssnano-preset-simple'),
},
}),
],
},
};processorOptions (â only cssnano)ç±»åï¼Object
é»è®¤å¼ï¼{ from: assetName }
å
许é
ç½® cssnano ç processoptions é
置项ã
parserã stringifier å syntax å¯ä»¥æ¯ä¸ä¸ªå½æ°ï¼ä¹å¯ä»¥æ¯ä¸ä¸ªå符串ï¼ç¨æ¥è¡¨ç¤ºå°ä¼è¢«å¯¼åºç模åã
â ï¸ å¦æä¼ å ¥ä¸ä¸ªå½æ°ï¼åå¿ é¡»ç¦ç¨
parallelé 置项ã.
import sugarss from 'sugarss';
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
parallel: false,
minimizerOptions: {
processorOptions: {
parser: sugarss,
},
},
}),
],
},
};module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: {
processorOptions: {
parser: 'sugarss',
},
},
}),
],
},
};warningsFilterç±»åï¼Function<(warning, file, source) -> Boolean>
é»è®¤å¼ï¼() => true
å
è®¸è¿æ»¤ css-minimizer warningsï¼é»è®¤ä½¿ç¨ cssnanoï¼ã
è¿å true å°ä¿ç warningï¼å¦åè¿ååå¼ï¼false/null/undefinedï¼ã
â ï¸ å¦ææ²¡æä½¿ç¨ source mapsï¼
sourceåæ°å°å å«undefinedã
webpack.config.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;
},
}),
],
},
};ä¸è¦å¿è®°ä¸ºææ loader å¯ç¨ sourceMap é项ã
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
module.exports = {
devtool: 'source-map',
module: {
loaders: [
{
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()],
};ç§»é¤æææ³¨éï¼å
æ¬ä»¥ /*! å¼å¤´ç注éï¼ã
module.exports = {
optimization: {
minimizer: [
new CssMinimizerPlugin({
minimizerOptions: {
preset: [
'default',
{
discardComments: { removeAll: true },
},
],
},
}),
],
},
};webpack.config.js
module.exports = {
devtool: 'source-map',
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minify: CssMinimizerPlugin.cssoMinify,
// Uncomment this line for options
// minimizerOptions: { restructure: false },
}),
],
},
};webpack.config.js
module.exports = {
devtool: 'source-map',
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minify: CssMinimizerPlugin.cleanCssMinify,
// Uncomment this line for options
// minimizerOptions: { compatibility: 'ie11,-properties.merging' },
}),
],
},
};webpack.config.js
module.exports = {
devtool: 'source-map',
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin({
minify: CssMinimizerPlugin.esbuildMinify,
}),
],
},
};å¦æä½ è¿æ²¡æé 读ï¼è¯·è±ä¸ç¹æ¶é´é 读æä»¬çè´¡ç®æåã