Не могу минимизировать код CSS с помощью веб-пакета
Версия Webpack: 4.16.3
Вся компиляция прошла успешно.
Мой код после компиляции в bundle.css не минимизируется.
Я пытаюсь использовать minimal : true в text-webpack-plugin, но он не работает.
Для компиляции я использую команду в командной строке: webpack в моем рабочем каталоге
Что я делаю неправильно?
Мой конфиг wepback:
'use strict'
const webpack = require("webpack");
const ExtractTextPlugin = require('extract-text-webpack-plugin')
module.exports = {
context: __dirname,
mode: 'production',
entry: __dirname + "/js/init.js",
output: {
path: __dirname + "/dist",
filename: "bundle.js"
},
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
noUiSlider: 'nouislider',
Vue: 'vue'
}),
new ExtractTextPlugin("bundle.css")
],
module: {
'rules': [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: {
loader: "css-loader",
options: {
minimize: true
}
}
})
}
, {
test: /\.less$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: {
loader: "css-loader!less-loader",
}
})
}, {
test: /\.(png|jpe?g|gif|cur)$/,
loader: 'url-loader?limit=8192&name=imgs/[name]-[hash].[ext]'
}
]
}
};
5 ответов
С версией пакета 4 выше вы можете использовать mini-css-extract-plugin вместо ExtractTextPlugin
плагин
Используйте OptimizeCSSAssetsPlugin для минимизации css-активов, экстракторы используются только для разделения выходных активов. Обратите внимание, что минимизация работает с производственным режимом, т.е. обязательно передайте "--mode production" в команде сборки webpack.
{....,
optimization: {
minimizer: [
//Incase you want to uglify/minify js
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: true
}),
new OptimizeCSSAssetsPlugin({
cssProcessorOptions: { discardComments: { removeAll: true } },
canPrint: true
})
]
}
....}
Полный рабочий пример Webpack 5
Вот полный пример. Не проводить различия между производством и разработкой, но это должно быть просто.
Он производит
dist/main.css
который представляет собой минимизированный CSS, содержащий оба:
- наш
main.scss
-
normalize.css
с помощьюnode_modules
Эффект обоих можно увидеть в тестовом файле index.html.
webpack.config.js
const path = require('path');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const nodeModulesPath = path.resolve(__dirname, 'node_modules');
module.exports = {
entry: {
main: ['./main.scss'],
},
mode: 'none',
module: {
rules: [
{
test: /\.(scss|css)$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: "sass-loader",
options: {
sassOptions: {
includePaths: [nodeModulesPath],
},
},
},
],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
}),
],
optimization: {
minimizer: [
new CssMinimizerPlugin(),
],
minimize: true,
}
};
пакет.json
{
"name": "webpack-cheat",
"version": "1.0.0",
"private": true,
"scripts": {
"build": "webpack",
"sass": "rm -f dist/main.css && sass main.scss dist/main.css"
},
"author": "Ciro Santilli",
"license": "MIT",
"devDependencies": {
"css-loader": "5.2.4",
"css-minimizer-webpack-plugin": "3.0.2",
"mini-css-extract-plugin": "2.1.0",
"normalize.css": "8.0.1",
"sass": "1.32.11",
"sass-loader": "11.0.1",
"style-loader": "2.0.0",
"webpack": "5.36.1",
"webpack-cli": "4.6.0",
"webpack-dev-server": "3.11.2"
}
}
main.scss
@use "normalize.css/normalize.css";
body {
background-color: red;
}
index.html
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<title>Sass import</title>
<link rel="stylesheet" href="dist/main.css">
</head>
<body>
<p>Hello</p>
</body>
</html>
Вместо этого вам следует использовать этот плагин.
Вот мой конфиг. Я думаю, что вы злоупотребляете use
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
{....,
test: /\.(scss|sass)$/,
use: [
process.env.NODE_ENV !== 'production' ? 'style-loader' : MiniCssExtractPlugin.loader, // creates style nodes from JS strings
{// translates CSS into CommonJS
loader: 'css-loader',
options: {
importLoaders: 1,
minimize: true
}
},
'postcss-loader',
"sass-loader" // compiles Sass to CSS
]
}