简介

在正常的打包过后,我们的css样式会自动插入 style 标签,如下:
image.png
但这通常不是我们需要的,我们需要将css单独打包成一个文件,通过 link 标签引入。并且可以为每个包含 css 的 js 文件创建一个 css文件,这时候我们就需要用到 mini-css-extract-plugin 插件了

配置

安装

首先要安装 mini-css-extract-plugin 插件。

  1. yarn add mini-css-extract-plugin --dev

配置

配置 webpack.config.js

/** ./webpack.config.js **/
let path = require('path');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let MiniCssExtractPlugin = require('mini-css-extract-plugin')

let htmlPlugins = ['index'].map(chunkName => {
  return new HtmlWebpackPlugin({
    filename: `${chunkName}.html`,
    inject:'body',
    chunks:[chunkName]
  })
});

module.exports = {
  mode: 'development',
  devServer: {
    port: 3000,
    open: true,
    compress: true,
    static: './dist'
  },
  entry:{
    index:'./src/index.js'
  },
  output: {
    filename:'[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use:[
          MiniCssExtractPlugin.loader, 
          {
            loader: 'css-loader',
            options: {
              modules: true
            }
          }, 
          'postcss-loader', 
          'sass-loader'
        ]
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    ...htmlPlugins,
    new MiniCssExtractPlugin({
      //filename:'main.css'
    })
  ]
}
  • 需要把 style-loader 替换为 MiniCssExtractPlugin.loader。
  • 在 plugins 中引用 new MiniCssExtractPlugin()。

最后就是 yarn build,结果如下:
image.png
我们看到这时 css 已经通过 link 引入了,在打包文件中也生成了 index.css。
上面我们配置的是开发模式,代码不会被压缩,如下:
image.png
现在我们把 mode 改成 production,打包过后,发现已经被压缩了,如下:
image.png

webpack 4 中的特异

在 webpack 5 中选择生产模式,mini-css-extract-pkugin 会自动压缩css,如上述的截图。
但是在 webpack 4 中我们需要做另外的设置,不然不会对css进行压缩。如下(看看就好):

  • 安装 optimize-css-assets-webpack-plugin

    yarn add optimize-css-assets-webpack-plugin --dev
    
  • 配置webpack ```javascript import TerserWebpackPlugin = require(‘terser-webpack-plugin’); import OptimizeCssAssetsWebpackPlugin = require(‘optimize-css-assets-webpack-plugin’);

module.exports = { //…. optimization:{// 手动指定压缩 minimizer:[new TerserWebpackPlugin({}), new OptimizeCssAssetsWebpackPlugin({})] }, //… } ``` terser-webpack-plugin 是 webpack 4 自带的 js 压缩。
optimize-css-assets-webpack-plugin 是 css 的压缩,配置 css 压缩包的同时必须配置 js 压缩,不然 js 就不会压缩。
这些在 webpack 5 中都自动实现了,不要配置。