webpack原理流程分析

三大階段

初始化階段

1.初始化參數(shù) : 從配置文件webpck.config.js和shell語(yǔ)句(命令行參數(shù))中讀取、合并參數(shù)獲得最終參數(shù)。 實(shí)例化插件Plugin . 即執(zhí)行new Plugin
2.實(shí)例化編譯對(duì)象compiler: 通過(guò)上一步獲得的參數(shù)初始化編譯對(duì)象compiler實(shí)例. compiler負(fù)責(zé)文件監(jiān)聽(tīng)和啟動(dòng)編譯。compiler包含了完整的webpack配置,
                              全局只有一個(gè)compiler對(duì)象。
3.加載插件:也即注冊(cè)插件。 依次調(diào)用插件的apply方法,讓插件可以監(jiān)聽(tīng)到后續(xù)編譯過(guò)程的所有事件結(jié)點(diǎn);同時(shí)向插件中傳入compiler實(shí)例,以便插件可以
                  通過(guò)compiler來(lái)調(diào)用webpack的api
4.environment: 環(huán)境。開(kāi)始應(yīng)用nodejs風(fēng)格的文件系統(tǒng)到compiler對(duì)象,以便后續(xù)過(guò)程中的文件尋找和讀取
5.entry-option: 從參數(shù)中的拿到entrys,并為每個(gè)入口實(shí)例化一個(gè)EntryPlugin。為后續(xù)entry的遞歸解析做準(zhǔn)備
6.after-plugin: 調(diào)用完所有的內(nèi)置和配置的插件的apply方法。即插件全部注冊(cè)完畢
7.after-resolvers: 根據(jù)配置初始化resolver[負(fù)責(zé)在文件系統(tǒng)中尋找指定路徑的文件]

編譯階段

1.run :  啟動(dòng)編譯
2.watch-run:  和run類(lèi)似,區(qū)別在于它是在監(jiān)聽(tīng)模式下啟動(dòng)編譯。在這個(gè)事件中,可以獲取到是哪些文件發(fā)生了變化導(dǎo)致重新編譯
3.compile:  該事件告訴插件,一次新的編譯將要啟動(dòng),同時(shí)會(huì)給插件帶上compiler對(duì)象
4.compilation: 編譯階段最重要的事件。開(kāi)發(fā)模式下,每當(dāng)文件變動(dòng)就會(huì)創(chuàng)建一個(gè)對(duì)象Compilation, 它包含當(dāng)前模塊資源、編譯生成資源、變化的文件。
           同時(shí)也會(huì)提供很多事件回調(diào)給到插件以便進(jìn)行擴(kuò)展
    4.1 build-module: 使用對(duì)應(yīng)的loader去轉(zhuǎn)換一個(gè)模塊
    4.2 normal-module-loader: Loader轉(zhuǎn)換完一個(gè)模塊后,使用acorn解析轉(zhuǎn)換后的內(nèi)容,生成對(duì)應(yīng)的抽象語(yǔ)法樹(shù)AST。 以便webpack后續(xù)的代碼進(jìn)行分析
    4.3 program: 弄清所有模塊的依賴(lài)關(guān)系。從配置的入口開(kāi)始,分析其AST, 當(dāng)遇到require導(dǎo)入其他模塊語(yǔ)句時(shí),將其加入依賴(lài)列表中。
          對(duì)新找出的依賴(lài)進(jìn)行遞歸分析,最終搞清楚所有模塊的依賴(lài)關(guān)系
5.seal:密封。 所有模塊及其依賴(lài)模塊都通過(guò)Loader轉(zhuǎn)換完成,根據(jù)依賴(lài)關(guān)系開(kāi)始生成chunk

輸出階段

1.should-emit (發(fā)出): 所有需要輸出的文件內(nèi)容已經(jīng)生成,詢(xún)問(wèn)插件有哪些需要輸出,哪些不需要輸出。
2.emit: 執(zhí)行文件輸出 。 可以在這里獲取和修改輸出的內(nèi)容。 
3.after-emit: 文件輸出結(jié)束
4. done:成功完成一次完整的編譯和輸出流程
5.failed:  如果在編譯和輸出的流程中遇到異常而導(dǎo)致webpack退出,就會(huì)直接跳到該事件,插件可以在該事件中獲取具體的錯(cuò)誤原因。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容