Не могу минимизировать код 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>

Вместо этого вам следует использовать этот плагин.

https://github.com/NMFR/optimize-css-assets-webpack-plugin

Вот мой конфиг. Я думаю, что вы злоупотребляете 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
]
}
Другие вопросы по тегам