补充
添加了一个简单的 loader,替换 const 为 var
1 | module.exports = function loader(source) { |
1 | const path = require('path') |
- 执行 webpack 执行文件
- 解析 shell 参数,如果有 config 配置,取得配置并初始化。生成 compiler 实例,遍历 plugins 数组如果是对象就调用 apply 方法
- 进入 compiler.run 开始执行编译
- 拿到 loaders 数组,进入 runloader 方法,之后 loadLoader,也就是用 require 加载 loader 的文件。之后读入口文件,转成 Buffer。
在调用loader处理的时候,又调用 utf8BufferToString,把 Buffer 转成字符串
进入 loader 的调用
- 进入解析阶段,对 loader 处理完的数据进行解析,解析成 ast
如果例子改成这样,也就是依赖其他模块的话
1 | import a from './index1'; |
在解析的时候是这样的过程
添加依赖模块,之后再解析到这个依赖的模块里
- 进入 seal 阶段, 遍历 entrys,生成对应的 chunk
之后在 createChunkAssets 方法里遍历 chunk 数组。在配置文件中输出的名字使用的是 [hash].js,它在这生成的。就是 replace 正则匹配替换
1 | const replacePathVariables = (path, data, assetInfo) => { |
之后进入 manifest 模板的 render,一个数组用来存一些固定字符串
最后将所有模块中的require
语法替换成__webpack_require__
来模拟模块化操作。
- 文件输出阶段,根据模板,往数组里 push 字符串,最后遍历一下拼接起来,通过 fs 文件系统写文件