Webpack5相关知识点(二)- 优化 (1)- SourceMap、提升打包构建速度

目录

一、SourceMap

1.1 简介

1.2 配置

1.2.1 cheap-module-source-map

1.2.2 source-map

二、提升打包构建速度

2.1 oneOf

2.2 Include/Exclude

2.3 Cache

2.4 Thead 

2.4.1 获取CPU核数

2.4.2 下载包

2.4.3 使用


一、SourceMap

Devtool | webpack 中文文档 (docschina.org)

1.1 简介

SourceMap(源代码映射):用来生成源代码与构建后代码一一映射的文件的方案。

当项目构建后,会将开发中的多个文件代码打包到一个文件中,经过压缩,去掉多余的空格,以及babel编译化后,最终会用于线上环境。经过这样处理后的代码与源代码会有很大区别。当遇到bug的时候,只能定位到构建后的代码位置,而无法定位到开发中代码的位置。

SourceMap(源代码映射)会生成一个 xxx.map 文件,里面包含源代码和构建后代码每一行、每一列的映射关系。当构建后代码出错了,会通过 xxx.map 文件,从构建后代码出错位置找到映射后源代码出错位置,从而让浏览器提示源代码文件出错位置,更快的找到错误根源

1.2 配置

SourceMap 的值有很多种情况,但主要关注 cheap-module-source-map 和 source-map

1.2.1 cheap-module-source-map

开发模式:cheap-module-source-map

  • 优点:打包编译速度快,只包含行映射
  • 缺点:没有列映射
module.exports = {
  // 其他省略
  mode: "development",
  devtool: "cheap-module-source-map",
};

1.2.2 source-map

生产模式:source-map

  • 优点:包含行/列映射
  • 缺点:打包编译速度更慢
module.exports = {
  // 其他省略
  mode: "production",
  devtool: "source-map",
};

二、提升打包构建速度

2.1 oneOf

打包时每个文件都会经过所有 loader 处理,使用 oneOf 后,只要匹配上一个 loader, 剩下的就不会继续匹配

使用:只需将loader配置放入 oneOf: [] 中即可

  // 加载器
  module: {
    rules: [ 
      {
        oneOf: [
            // loader的配置
            // 省略...
        ],
      },
    ],
  },

2.2 Include/Exclude

  • include:包含,只处理 xxx 文件
  • exclude:排除,除了 xxx 文件以外其他文件都处理

处理js文件,以排除node_modules目录下的文件为例

(第三方的库或插件下载完后都存放在 node_modules 中,这些文件是不需要编译可以直接使用的,所以对 js 文件处理时,要排除 node_modules 下面的文件)

使用 exclude:

          {
            test: /\.m?js$/,
            exclude: /(node_modules)/, // 排除 node_modules下的文件
            use: {
              loader: "babel-loader",
            },
          },

使用include:

          {
            test: /\.m?js$/,
            // exclude: /(node_modules)/, // 排除 node_modules下的文件
            include: path.resolve(__dirname, "../src"), // 只处理src目录下文件,其他文件不处理
            use: {
              loader: "babel-loader",
            },
          },

2.3 Cache

对 Eslint 检查 和 Babel 编译结果进行缓存,这样再次打包时速度就会更快

使用:以Babel为例

          {
            test: /\.m?js$/,
            include: path.resolve(__dirname, "../src"),
            use: {
              loader: "babel-loader",
              options: {
                cacheDirectory: true, // 开启babel缓存
                cacheCompression: false, // 关闭缓存文件压缩
              },
            },
          },

再次打包后,可在 node_modules 下找到缓存文件

2.4 Thead 

多进程打包:开启电脑的多个进程同时干一件事,速度更快。

注意:请仅在特别耗时的操作中使用,因为每个进程启动就有大约为 600ms 左右开销。

2.4.1 获取CPU核数

// nodejs核心模块,直接使用
const os = require("os");
// cpu核数
const threads = os.cpus().length;

2.4.2 下载包

npm i thread-loader -D

2.4.3 使用

以处理babel-loader为例

// Node.js的核心模块,专门用来处理路径问题
const os = require("os");
const path = require("path");

const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

const TerserPlugin = require("terser-webpack-plugin");

// cpu核数
const threads = os.cpus().length;

module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "static/js/main.js",
    clean: true,
  },
  module: {
    rules: [
      // loader的配置
      {
        oneOf: [
          // 省略...
          {
            test: /\.m?js$/,
            include: path.resolve(__dirname, "../src"),
            use: [
              {
                loader: "thread-loader", // 开启多进程
                options: {
                  workers: threads, // 数量
                },
              },
              {
                loader: "babel-loader",
                options: {
                  cacheDirectory: true, // 开启babel缓存
                  cacheCompression: false, // 关闭缓存文件压缩
                },
              },
            ],
          },
        ],
      },
    ],
  },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JHY97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值