思路图解
思路:
A 方法
-
找出入口文件所有的依赖关系
- 读取并编译入口文件代码
- 依据入口文件代码广度遍历所有依赖文件(包括子级)
- 对外输出依赖关系
-
通过构建 CommonJS 代码来获取 exports 导出的内容
- 构建 modules 对象字符串(key 为文件 id, 值为
[对应的函数, mapping]
) - 构建 result 函数字符串,并传入 modules 参数,函数中构建 require 函数,用于获取并执行对应文件
- 执行
require(entry)
, 即执行对应的文件
- 构建 modules 对象字符串(key 为文件 id, 值为
有哪些功能点
- 读取并编译文件代码
- 获取所有依赖文件
- 实现打包功能(构建出 CommonJS 的写法)
缺点:
- 是用 relativePath 做文件模块的唯一标识,容易冲突
B 方法
与 A 方法大体思路一致。
区别
- createCode 函数 -》createAsset 函数。createAsset 函数在返回值对象时,多一个标识符 id(自增数字)
- getDependencies -》createGraph, 给每个文件 item 添加 mapping 对象用来保存自己所依赖的文件 path:id 对象,方便使用时找到 id
- bundle 函数。构建 modules 字符串时,是 id 和 [function, mapping] 做 key, value。构建 result 字符串时,require 函数,接收的是 filepath 对应的 id. 有 localRequire 函数
综上所述:
主要区别是此方法使用自增的 id 作为文件模块的唯一标识(不会重复)而不是文件相对路径(容易重复),
但是这也导致代码有更大复杂性,比如模块自身需记录 mapping(来记住依赖文件相对路径和其 id 的对应关系)。用到 localRequire 方法来进行相对路径和 id 的转换。
A 方法多了处理 css 文件的能力
代码:
见 github https://github.com/sunchengua…
参考资料
https://juejin.im/book/5bdc71…
https://zhuanlan.zhihu.com/p/…
https://zhuanlan.zhihu.com/p/…