美文网首页
常用plugin

常用plugin

作者: locky丶 | 来源:发表于2019-07-30 16:57 被阅读0次

    开启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

          本文链接:https://www.haomeiwen.com/subject/xmuahctx.html