常用plugin

开启HMR

用途:页面热更新(模块热替换)
首先我们要确保项目是基于webpack-dev-server或webpack-dev-middle进行开发的,webpack本身的命令行并不支持HMR。

const webpack = require('webpack');
module.exports = {
  // ...
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ],
  devServer:{
    hot:true,
  }
}

也可以在页面中开启HMR,比如下面这个例子:

// index.js
import { add } from 'util.js';
add(2,3);
if(module.hot){
  module.hot.accept();
}

大多数时候,还是建议开发者使用第三方提供的HMR解决方案(比如react-hot-loader、vue-loader),因为HMR触发过程中可能会有很多意想不到的问题。

html-webpack-plugin

用途:自动打包生成html

const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    // ...
    plugins: [
        new HtmlWebpackPlugin()
    ],
};

clean-webpack-plugin

在每次构建前清理 /dist 文件夹。
官方给的例子在新版本中运行不了,正确配置如下:

const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  ...
  plugins:[
        new CleanWebpackPlugin()
  ],
}

extract-text-webpack-plugin(webpack 4之前版本)

用途:提取样式到css文件
在webpack.config.js中引入:

const ExtractTextplugin = require('extract-text-webpack-plugin');
module.exports = {
  entry: './app.js';
  output: {
    filename:'bundle.js',
  },
  mode:'development',
  module: {
    rules:[
      {
        test:/\.css$/,
        use:ExtractTextplugin.extract({
          fallback:'style-loader',
          use:'css-loader',
        })
      }
    ]
  },
  plugins:[
    new ExtractTextPlugin('bundle.css')
  ]
} 

mini-css-extract-plugin(webpack 4及以上版本)

mini-css-extract-plugin可以理解成extract-text-webpack-plugin的升级版,它拥有更丰富的特性和更好的性能,从Webpack 4开始官方推荐使用该插件进行样式提取(Webpack 4以前的版本是用不了的)。
说到mini-css-extract-plugin的特性,最重要的就是它支持按需加载CSS,以前在使用extract-text-webpack-plugin的时候我们是做不到这一点的。举个例子,a.js通过import()函数异步加载了b.js,b.js里面加载了style.css,那么style.css最终只能被同步加载(通过HTML的link标签)。但是现在mini-css-extract-plugin会单独打包出一个0.css(假设使用默认配置),这个CSS文件将由a.js通过动态插入link标签的方式加载。

在webpack.config.js中引入:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
    entry: './app.js',
    output: {
        filename:'[name].js',
    },
    mode: 'development',
    module: {
        rules: [{
            test: /\.css$/,
            use: [
                {
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                        publicPath:'../',
                    },
                },
                'css-loader'
            ],
        }],
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].css',
            chunkFilename:'[id].css',
        })
    ]
}

压缩css

压缩CSS文件的前提是使用extract-text-webpack-plugin或mini-css-extract-plugin将样式提取出来,接着使用optimize-css-assets-webpack-plugin来进行压缩,这个插件本质上使用的是压缩器cssnano,当然我们也可以通过其配置进行切换。具体请看下面的例子:

const ExtractTextPlugin = require('extract-text-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = {
    // ...
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: 'css-loader',
                }),
            }
        ],
    },
    plugins: [new ExtractTextPlugin('style.css')],
    optimization: {
        minimizer: [new OptimizeCSSAssetsPlugin({
            // 生效范围,只压缩匹配到的资源
            assetNameRegExp: /\.optimize\.css$/g,
            // 压缩处理器,默认为 cssnano
            cssProcessor: require('cssnano'),
            // 压缩处理器的配置
            cssProcessorOptions: { discardComments: { removeAll: true } },
            // 是否展示 log
            canPrint: true,
        })],
    },
};

terser (webpack 4 集成)

压缩Javascript
// 自定义terser-webpack-plugin配置

const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
    //...
    optimization: {
        // 覆盖默认的 minimizer
        minimizer: [
            new TerserPlugin({
                /* your config */
                test: /\.js(\?.*)?$/i,
                exclude: /\/excludes/,
            })
        ],
    },
};

webpack-bundle-analyzer

用途: 分析打包后输出的bundle体积大小。
安装:

npm i webpack-bundle-analyzer -D

webpack.config.js配置:

const Analyzer = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
  ...
  plugins: [
    new Analyzer()
    ],
}

你可能感兴趣的:(常用plugin)