Write By CS逍遥剑仙 我的主页: csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: sunjianfeng@csxiaoyao.com QQ: 1724338257
Compiler
和 Compilation
对象。使用配置文件合并 shell 传参得到初始化参数,再用此参数实例化 Compiler
类,并注册所有插件且绑定 webpack 生命周期 hook。Compiler
是工作流中的最高层对象,提供全局钩子,继承自 Tapable(即完整的事件流程核心类) ,记录了完整的 Webpack 环境配置信息,每个 Webpack 配置对应一个 Compiler 对象,通过 Tapable 的 Hook 机制管理整个打包流程的生命周期;Compilation
是由 Compiler
创建的实例对象,也继承自 Tapable ,是每次打包流程最核心的流程,进行模块依赖解析、优化资源、渲染 runtime 代码等,代表一次资源版本构建,dev-server 下 watch 会不断生成新的 Compilation
。 Compiler
类的 run
方法创建 Compilation
实例,Compilation
从 entry 开始使用各种 loader
处理模块,解析 AST 找出每个 chunk
的 modules
依赖关系,递归编译依赖的模块。chunks
在 output
下生成 bundle
文件,并结果 plugin
处理成最终的 bundle
文件。三个步骤:模板 Hash 更新、模板渲染 chunk、生成文件。webpack 的产出代码是根据不同配置,执行不同操作,拼接模板代码而成的,对于普通打包,webpack 的打包产物是一个 立即执行函数表达式 (IIFE),函数结构如下:
整个 IIFE 函数的核心流程分四步:
installedModules
;__webpack_require__
;__webpack_require__
函数的一些属性;__webpack_require__
函数,传入 entry 模块,并返回执行结果,即 entry 的 exports 对象该 IIFE 函数传入的参数为 modules
对象,key 为文件路径,value 是类似 AMD factory 格式的函数。
__webpack_require__
函数该函数是 webpack 的核心,负责调用并注册模块:
IIFE 传入的 modules 对象,key 是模块路径,value 是类似 AMD factory 格式的函数:
factory 的 3 个参数分别对应 __webpack_require__
函数内执行 call 传入的 3 个参数,而上下文 this 即 this 是传入的 module.exports 即 exports 对象。
__webpack_require__
添加属性原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。