那么在这个主线中我们关心什么呢?我们应该关心如下几点:
- webpack 的编译过程主要有哪些阶段?(生命周期)
- webpack 是如何 从 entry 开始解析出整个依赖树的?
- loaders 是在何时被调用的?
- 最终是如何知道要生成几个文件,以及每个文件的内容的? 而其他一些不重要的问题我们尽量忽略,比如如何解析配置,如何处理错误,HASH 规则等。等看完主线流程后再回头单独看这些点。
到此为止,我们从代码上大概理清楚了webpack 是如何编译我们的源码的。总结下来主要是如下几步:
- 根据我们的webpack配置注册号对应的插件
- 调用 compile.run 进入编译阶段,
- 在编译的第一阶段是
compilation,他会注册好不同类型的module对应的 factory,不然后面碰到了就不知道如何处理了 - 进入
make阶段,会从entry开始进行两步操作: - 第一步是调用 loaders 对模块的原始代码进行编译,转换成标准的JS代码
- 第二步是调用 acorn 对JS代码进行语法分析,然后收集其中的依赖关系。每个模块都会记录自己的依赖关系,从而形成一颗关系树
- 最后调用
compilation.seal进入render阶段,根据之前收集的依赖,决定生成多少文件,每个文件的内容是什么