本文基於
webpack
接收的參數options
爲非數組討論,且只討論webpack
主流程。 上一篇文章主要講了Tapable
,順帶提了webpack
方法執行流程,可是隻是一筆帶過,這篇文章會大體瞭解webpack
方法的執行流程。html
本文深刻度不夠,有些地方講的不夠深。理解深刻後,會再次重寫,彌補不夠深刻的遺憾。 react
方法內部首先對 options
進行校驗,接下來便對 options
進行處理,對一些 webpack
須要的參數,又未設置的參數,進行初始化操做。webpack
options = new WebpackOptionsDefaulter().process(options);
複製代碼
實例化 Compiler
,並傳入 context
,也就是當前工做目錄,並在實例化生成的對象 compiler
上掛載 options
。web
NodeEnvironmentPlugin
插件,並給 compiler
對象賦予對象讀寫能力。具體源碼解析能夠看這裏,做者分析的十分詳細。options
上定義的 plugins
。WebpackOptionsApply.js
文件的 process
方法。在方法內,主要處理 4 件事情。
options
注入內置插件,並對 options
作進一步的轉換。entryOption
生命週期函數,收集 webpack
配置的入口信息。afterPlugins
生命週期函數。afterResolvers
生命週期函數。視狀況運行 run
或 watch
方法,這裏僅以 run
舉例說明。數組
beforeRun
生命週期函數清除緩存,代碼位於 NodeEnvironmentPlugin
文件中。run
生命週期函數。compile
方法。this.newCompilationParams()
建立 params
對象,並調用 compiler
上的 normalModuleFactory
和 contextModuleFactory
生命週期函數。建立的對象上存在 normalModuleFactory
、contextModuleFactory
和 compilationDependencies
屬性。beforeCompile
生命週期函數,讀取 dll
中模塊信息( manifest
),代碼位於 DllReferencePlugin
。compile
生命週期函數,代碼位於 DllReferencePlugin
、ExternalsPlugin
和 DelegatedPlugin
。
DllReferencePlugin
主要是用來把 manifest
文件做爲 externals
來使用,並注入 ExternalModuleFactoryPlugin
和 DelegatedModuleFactoryPlugin
ExternalsPlugin
的注入是因爲傳入的 options
上有 externals
,注入邏輯在 WebpackOptionsApply.js
。DelegatedPlugin
暫未發現用在哪,不理解其做用。this.createCompilation()
方法建立 compilation
對象後,會調用 thisCompilation
和 compilation
兩個生命週期函數。make
生命週期函數,函數內部經過調用 compilation
的 addEntry
方法添加入口依賴,入口依賴共有四種,分別爲 MultiEntryPlugin
、DynamicEntryPlugin
、DllEntryPlugin
和 SingleEntryPlugin
。_addModuleChain
方法得到此模塊的 moduleFactory
,並調用其 create
方法,方法中調用 beforeResolve
生命週期函數,對模塊位置進行解析。buildModule
函數,函數內部會調用 NormalModule
文件中的 doBuild
方法,doBuild
方法中會使用 loader-runnner
庫中 runLoader
方法構建模塊。compilation
對象上 seal
生命週期函數,打包 chunks
和 assets
。emit
生命週期函數,輸出編譯文件。webpack
主流程十分複雜,有時候會發現難以理解,常常須要拜讀大佬文章,耗時嚴重,又不知道如何描述,非常頭疼。故接下來會把精力投入到 react
源碼。緩存