思路圖解
思路:
A方法
-
找出入口文件全部的依賴關係css
- 讀取並編譯入口文件代碼
- 依據入口文件代碼廣度遍歷全部依賴文件(包括子級)
- 對外輸出依賴關係
-
經過構建CommonJS代碼來獲取exports導出的內容git
- 構建modules對象字符串(key爲文件id, 值爲
[對應的函數, mapping]
)
- 構建result函數字符串,並傳入modules參數,函數中構建require函數,用於獲取並執行對應文件
- 執行
require(entry)
, 即執行對應的文件
有哪些功能點github
- 讀取並編譯文件代碼
- 獲取全部依賴文件
- 實現打包功能(構建出CommonJS的寫法)
缺點:app
- 是用relativePath作文件模塊的惟一標識,容易衝突
B方法
與A方法大致思路一致。函數
區別ui
- createCode函數 -》createAsset函數。 createAsset函數在返回值對象時,多一個標識符id(自增數字)
- getDependencies -》 createGraph, 給每一個文件item添加mapping對象用來保存本身所依賴的文件path:id對象,方便使用時找到id
- bundle函數。構建modules字符串時,是 id和[function, mapping]作key, value。構建result字符串時,require函數,接收的是filepath對應的id. 有localRequire函數
綜上所述:spa
主要區別是此方法使用自增的id做爲文件模塊的惟一標識(不會重複)而不是文件相對路徑(容易重複),
可是這也致使代碼有更大複雜性,好比模塊自身需記錄mapping(來記住依賴文件相對路徑和其id的對應關係)。用到localRequire方法來進行相對路徑和id的轉換。code
A方法多了處理css文件的能力對象
代碼:
見github https://github.com/sunchengua...blog
參考資料
https://juejin.im/book/5bdc71...
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...