基本思路:
- 获取模块内容
- 生成对应模块id(文件的相对路径)
- 解析源码为AST
- 修改AST节点,require–>_webpack_require_ 文件路径为相对路径
- 保存依赖模块数组
- 将AST打包回源码
- 遍历递归依赖数组,修改依赖模块
- 使用ejs模板打包代码
相关配置
bin
bin相当于运行哪一个命令,执行哪一个文件
1 | "bin":{ |
npm link的流程
1
2
3
4 // 在csr-pack目录下 注意package.json中的bin配置以及后边是bin目录下的csr-pack.js
npm link
// 在webpack-go5下
npm link csr-pack
AST 抽象语法树
babylon
把源码转化为AST
@babel/traverse
遍历AST节点
@babel/types
替换AST节点
@babel/generator
将AST打包为源码
process.cwd()
获取当前工作目录
手写loader思路:
- loader其实就是一个函数
- 新增style-loader 和less-loader两个函数
- 配置webpack.config.js中rules,为两个文件的绝对路径
- 在getSource获取源码时,对文件路径进行正则匹配
- 匹配成功的文件 进行从后往前调用函数处理
## plugin: 使用tapable实现生命周期控制
代码下载
主要相关代码
1 | // compiler.js |