返回
多进程打包:thread-loader 源码解读(二)
前端
2023-10-15 11:16:16
引言
在 上篇文章 中,我们介绍了 thread-loader 的整体设计和 workerPool 的初始化过程。本文将继续深入 thread-loader 的源码,重点解读 pitch 方法的具体实现逻辑。
pitch 方法
pitch 方法是 thread-loader 的核心方法,负责解析 webpack 配置并初始化 WorkerPool。其源码如下:
const webpack = require('webpack');
const WorkerPool = require('neo-async').WorkerPool;
const path = require('path');
class ThreadLoader {
// ...
pitch(remainingRequest, precedingRequest, data) {
const options = this.getOptions(data);
let threadPool = webpack.threadLoaderPool;
// 获取配置
const config = this.getWorkerConfig(options);
// 初始化 workerPool
if (!threadPool) {
threadPool = webpack.threadLoaderPool = new WorkerPool(config.workerCount, config.workerOptions);
}
// ...
}
}
1. 获取选项
pitch 方法首先通过 getOptions 方法获取 webpack 配置中的 thread-loader 选项。这些选项包括 workerCount(工作进程数量)、workerParallelJobs(每个工作进程并行处理的任务数量)、poolRespawn(工作进程异常退出后是否重启)等。
2. 获取工作进程配置
接下来,pitch 方法调用 getWorkerConfig 方法获取工作进程的配置项,包括:
- workerCount: 工作进程数量
- workerOptions: 工作进程选项,包括工作进程的文件路径、参数等
- resourcePath: 资源路径
3. 初始化 WorkerPool
如果 webpack.threadLoaderPool 为 undefined,说明这是第一次初始化 WorkerPool,则创建一个新的 WorkerPool。WorkerPool 是一个线程池,用于管理和调度工作进程。
后续处理
pitch 方法后续还完成了以下处理:
- 创建一个新的 threadLocalScope 对象,用于存储工作进程的局部变量
- 将 threadLocalScope 添加到 webpack 的 threadLoaders 对象中,以便其他 loader 访问
- 将 remainingRequest 和 precedingRequest 添加到 threadLocalScope 中,以便工作进程可以访问这些信息
结语
通过 pitch 方法的分析,我们了解到 thread-loader 如何解析 webpack 配置并初始化 WorkerPool。WorkerPool 负责管理和调度工作进程,为多进程打包提供了基础。在下一篇文章中,我们将深入探讨 thread-loader 的 run 方法,了解其如何将任务分发给工作进程。
相关术语
- WorkerPool: 线程池,用于管理和调度工作进程
- webpack.threadLoaderPool: 全局的 WorkerPool 对象,存储所有 thread-loader 使用的 WorkerPool
- threadLocalScope: 工作进程的局部变量存储对象