webpack开发环境性能优化之优化打包构建速度-HRM

因为修改部分文件的时候其他文件也会重新打包,肯定会影响打包速度因此就需要

HRM热模块替换:只会打包某一个模块而不是所有都重新打包

  • 样式文件在使用style-loader的情况下可以使用HRM
  • js文件默认不使用HRM,需要自动刷新:需要修改js文件实现热加载
  • html不能随之热加载,也不会自动刷新(修改entry入口,改成数组引入html),pwa不做HRM

image-20200728220047053

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // html模板
const MiNiCssExtractPlugin = require('mini-css-extract-plugin'); // 提取出css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
// 压缩css
process.env.NODE_ENV = 'development';
const webpack = require('webpack');
// 复用css的loader
const commonCssLoader = [
  // {
  //   loader:MiNiCssExtractPlugin.loader,
  //   options:{
  //     publicPath:'../',//避免css中的路径引入错误
  //   }
  // }, //代替style标签而是引入css的形式
  'style-loader',
  'css-loader',
  // {
  //   //把css压缩
  //   loader: "postcss-loader",
  //   options: {
  //     //配置package.json的"browserslist"
  //     ident: "postcss",
  //     plugins: () => [require("postcss-preset-env")()],
  //   },
  // },
];
module.exports = {
  mode: 'development', // 生产模式
  entry: ['./src/js/index.js', './src/index.html'],
  output: {
    filename: 'built.js',
    path: path.resolve(__dirname, 'build'),
  },
  module: {
    rules: [
      // css\less
      {
        test: /\.css$/,
        use: [...commonCssLoader],
      },
      {
        test: /\.less$/,
        use: [...commonCssLoader, 'less-loader'],
      },
      // js先eslint再babel
      // eslint检查
      // {
      //   // package.json配置"eslintConfig"
      //   test: /\.js$/,
      //   exclude: /node_modules/,
      //   enforce: 'pre', // js优先执行eslint
      //   loader: 'eslint-loader',
      //   options: {
      //     fix: true, // 规范自动修复
      //   },
      // },
      // js兼容处理
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: [
            [
              '@babel/preset-env',
              {
                useBuiltIns: 'usage', // 按需加载
                corejs: {
                  version: 3, // 制定core-js版本
                },
                targets: {
                  // 制定兼容的目标
                  chrome: '60',
                  firefox: '60',
                  ie: '9',
                  safari: '10',
                  edge: '17',
                },
              },
            ],
          ],
        },
      },
      {
        test: /\.(jpg|png|gif)$/,
        loader: 'url-loader',
        options: {
          limit: 8 * 1024,
          name: '[hash:10].[ext]',
          outputPath: 'imgs',
          esMoudle: false,
        },
      },
      {
        test: /\.html$/,
        loader: 'html-loader',
      },
      {
        exclude: /\.(js|html|css|less|json|jpg|png|gif)$/,
        loader: 'file-loader',
        options: {
          outputPath: 'media',
        },
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html', // 引用html模板
      // minify:{//压缩html
      //     collapseInlineTagWhitespace:true,
      //     removeComments:true,
      // }
    }),
    new MiNiCssExtractPlugin({
      filename: 'css/built.css', // 设置css的输出
    }),
    // new OptimizeCssAssetsWebpackPlugin(), //压缩css的文件
    // new webpack.HotModuleReplacementPlugin(),
    // new webpack.NamedModulesPlugin(),
  ],
  devServer: {
    contentBase: path.resolve(__dirname, 'build'),
    compress: true,
    port: 3001,
    // 开启HRM热模块替换
    hot: true,
  },
};

//index.js
//.......
//.......
if (module.hot) {
  //可以监听print.js的代码变化启动HRM,但是对入口文件index.js不能起到作用
  module.hot.accept('./print.js', () => {
    console.log('热加载print.');
    //console.log(module.hot);
    print();
  });
}

对于非入口js文件和css可以启动HRM了,html对于pwa单页面应用则不宜启动HRM,随之刷新就好了(index.js也是如此)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值