前端Webpack中`compilation` 和 `compiler`

在前端Webpack中,compilationcompiler 是两个核心对象,它们在整个构建流程中扮演着不同的角色。理解它们的区别对于编写Webpack插件和深入理解Webpack工作原理至关重要。

Compiler (编译器)

Compiler 对象是Webpack的核心引擎 ,它代表了整个Webpack构建的生命周期。 12

  • 全局性与生命周期 : Compiler 是一个全局单例对象,在Webpack启动时(无论是通过命令行接口CLI还是Node.js API)只创建一次,并贯穿整个Webpack的运行过程。 12

  • 职责:

    • 它负责从Webpack配置中读取所有的选项。 1
    • 它初始化并管理整个Webpack构建过程。 12
    • 它负责创建 Compilation 实例。 12
    • 它处理文件监听(watch 模式),当文件发生变化时触发重新编译。 1
    • 它提供了许多高层级的生命周期钩子(hooks) ,允许插件在Webpack的整体运行阶段进行干预,例如在开始编译前、编译完成时、或在文件输出时等。 12 常见的钩子有 beforeRun, run, compile, emit, done 等。 13
  • 插件交互 : 大多数用户级别的Webpack插件会首先注册到 Compiler 对象上,通过 compiler.hooks.someHook.tap(...) 的方式来监听和响应Webpack生命周期中的事件。 14

  • Tapable 继承 : Compiler 继承自 Tapable 类,这使得它能够通过发布-订阅模式来注册和调用各种钩子。 14

Compilation (编译)

Compilation 对象代表了Webpack一次具体的构建过程25

  • 局部性与生命周期 : 每当Webpack执行一次新的编译(包括在watch模式下的每一次重新构建),都会创建一个全新的 Compilation 实例。 25

  • 职责:

    • 它是Webpack中执行实际构建工作的"心脏"或"大脑"。 2
    • 它包含了当前构建过程的所有信息,例如模块、依赖、Chunk、生成的资源(assets)等。 25
    • 它负责构建模块依赖图 ,解析模块间的依赖关系。 26
    • 它负责编译模块,应用Loader对模块进行转换。
    • 它负责生成Chunk ,并将模块组织到不同的Chunk中。 6
    • 它负责优化 (如Tree Shaking、代码压缩等)。 4
    • 它负责生成最终的输出文件 (assets)。 67
    • 它提供了更细粒度的生命周期钩子 ,允许插件在模块处理、Chunk优化、资源生成等具体步骤中进行干预。 47 常见的钩子有 optimize, processAssets, addEntry 等。 48
  • 插件交互 : 插件通常在 Compiler 的钩子中获取到 Compilation 实例,然后通过 compilation.hooks.someHook.tap(...) 来操作当前构建的细节,例如修改生成的资源、添加新的模块等。 47

  • 子编译器 : Compilation 还可以创建子编译器(createChildCompiler),这允许在Webpack内部运行另一个Webpack实例,通常用于处理特殊资源或独立构建流程。 69

总结区别

特性 Compiler (编译器) Compilation (编译)
角色 Webpack的全局协调者 ,代表整个构建环境。 12 单次构建的执行者 ,代表一次具体的编译过程。 25
生命周期 在Webpack启动时创建一次,贯穿整个运行周期。 12 每次构建(包括watch模式下的重编译)都会创建新的实例。 25
职责范围 负责整体配置、文件监听、创建Compilation实例等高层级任务。 13 负责模块的解析、加载、转换、依赖图构建、Chunk生成、优化和资源输出等具体构建任务。 26
钩子粒度 提供高层级的生命周期钩子(如 run, done)。 13 提供更细粒度的构建流程钩子(如 processAssets, optimize)。 48
获取方式 通过Webpack的Node.js API直接获取,或在插件的apply方法中作为参数传入。 27 Compiler的某些钩子中(例如compiler.hooks.compilation.tap)作为参数传入。 47

简而言之,Compiler 就像一个项目经理 ,负责启动和管理整个项目(Webpack构建过程),而 Compilation 则像一个具体任务的执行团队,负责完成项目中的每一个详细任务(模块编译、打包、优化等)。每次项目经理启动一个新项目或重新开始一个项目时,都会组建一个新的执行团队。

相关推荐
海兰22 分钟前
【web应用】Excel 项目数据自动化分析系统(AI 驱动分析)详细设计与部署指南(附源代码)
前端·人工智能·自动化·excel
2501_9400417425 分钟前
技术分享:高质量全栈开发提示词设计实践 —— 覆盖简单到复杂
前端·prompt
IT_陈寒1 小时前
Python的os.path.join居然能这么坑?
前端·人工智能·后端
艳阳天_.1 小时前
星瀚弹框页面实现
java·前端·python
EdgeOne边缘安全加速平台1 小时前
EdgeOne Web 防护×AI 升级:让 AI 既参与攻击识别,也参与误报纠错
前端·人工智能·腾讯云·edgeone
nuIl1 小时前
实现一个 Coding Agent(6):并行工具调用
前端·ai编程·cursor
Rain5091 小时前
2.1 Nest.js 项目初始化与模块化架构
开发语言·前端·javascript·后端·架构·数据分析·node.js
cjp5601 小时前
009. ASP.NET WEB API 用户关联esp32设备
前端·后端·asp.net
Insseals2 小时前
因斯特浮动模块快速接头✨五大核心优势
前端
沐土Arvin2 小时前
港澳台行政区域json
前端