webpack学习笔记-webpack中打包构建速度优化

96 阅读1分钟

OneOf

当规则匹配时,只使用第一个匹配规则

当webpack处理静态资源的时候,需要经过每一个loader进行判断,是否可以处理当前的静态资源,如果其中一个a-loader可以解析,这个静态资源还是会被b-loader、c-loader等检测是否可以解析,浪费打包性能。可以使用oneOf

webpack.config.js中配置

module: {
  rules: [
    // 每个文件只能被一个loader处理,不在遍历所有loader
    oneOf: [
       {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
      },
      // less-loader
      {
        test: /\.less$/i,
        use: ["style-loader", "css-loader", "less-loader"], // 执行顺序从左到右

      },
      // sass-loader
      {
        test: /\.s[ac]ss$/i,
        use: ["style-loader", "css-loader", "sass-loader"], // 执行顺序从左到右

      },
      {
        test: /\.styl$/,
        // loader 只能引入一个loader use 可以引入多个文
        use: ["style-loader", "css-loader", "stylus-loader"], // 执行顺序从左到右
      },
      {
        test: /\.(png|jpg|gif)$/i,
        type: "asset",  //资源模块
        generator: {
          //[hash:10] 打包出来的图片名称为hash值,长度10位
          filename:'image/[hash:10][ext][query]'
        },
        parser: {
        dataUrlCondition: {
          maxSize: 10 * 1024 // 10kb
        }
      }
      },
      {
        test: /\.(ttf|woff2?)$/i,
        type: "asset/resource",  //资源模块
        generator: {
          //[hash:10] 打包出来的图片名称为hash值,长度10位
          filename:'media/[hash:10][ext][query]'
        },
      },
      {
        test: /\.m?js$/,
        exclude: /node_modules/, // 去除node-module下的文件转换
        use: {
          loader: 'babel-loader',
        }
      }
    ]
  ]
}

exclude/include

开发时我们需要使用第三方的库或插件,所有文件都下载到 node_modules中,而这些文件是不需要webapck 编译的,所以我们在对js文件处理时,就要排除它们。

  • Include

包含,只解析XXX文件

  • Exclude 排除,指定不解析xxx文件

webapck.config.jsimage.png

注意incledeexclude使用一种即可

Cache

缓存生成的 webpack模块 和 chunk, 来改善构建速度。 每次打包时js文件都要经过EslintBabel,速度比较慢。我们可以缓存之前的 Eslint检查和Babel编译的结果。这样第二次打包更快。

webpack.config.js

image.png

image.png

Thread多进程打包

当项目越来越大时,打包的速度越来越慢,我们想要继续提高打包速度,其实就是要提升js的打包速度,因为其他文件比较少。而对js文件的处理主要是 Eslint Babel Terser三个工具,所以我们要提升他们的运行速度,我们可以开启多进程同时处理js文件,这样速度就比之前的单进程打包更快。

仅在耗时比较长的项目使用,因为每个进程启动就有大约600ms左右的开销

  1. 获取cpu的核数,每个电脑的不一样
// node的核心模块
const os = require(os) 
// 获取cpu核数
const threads = os.cpus().length
  1. 下载 thread-loader
npm install thread-loader --save-dev
  1. webpack.config.js 配置
// 这里只处理js文件
module.exports = {
  module: {
    rules: [
      ...,
      {
        test: /\.m?js$/,
        //  exclude: /node_modules/, // 排除node-module的文件转换
        include: path.resolve(__dirname,'../src'), // 只处理src下面的文件,其他文件不解析
        use: [
          {
            loader: 'thread-loader', // 开启多进程
            options: {
              // 产生的 worker 的数量,默认是 (cpu 核心数 - 1),或者
              workers: threads // 
            },
          },
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true, // 开启babel缓存
              cacheCompression: false, //关闭babel缓存的zip压缩
            },
          },
        ]
      }
    ]
  },
  // 在eslint插件中也可以开启多线程
  plugins: [
    new Eslint({
      // 哪些文件我们检查,这里我们检测src下面的文件
      context: path.resolve(__dirname, "../src"),
      exclude: 'node_modules', // 排除node-module的文件转换
      cache: true, // 开启缓存
      cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"), // 缓存文件的位置。
      threads: true, // 开启多进程
    }),
  ],
}