返回

多进程打包:thread-loader 源码解读(二)

前端

引言

上篇文章 中,我们介绍了 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: 工作进程的局部变量存储对象