webpack比較常見的用法有兩種:1、使用配置文件;2、不使用配置文件(用命令 webpack <entry> [<entry>] <output>)。這兩種方式參數的初始化方式不太同樣:java
方式1、從配置文件和shell語句中讀取併合並參數;方式2、從shell語句從直接讀取入口和出口參數。本文會結合源碼,分析一下這兩種方式的實現。(文章使用的webpack版本是3.10.0)webpack
webpack執行的入口文件是bin目錄下面的webpack.js,負責參數轉換處理的文件是bin目錄下面的convert-argv.js。下面來簡單介紹一下這兩個文件的做用。web
入口文件的大概做用是:經過convert-argv.js進行參數初始化處理,webpack.js文件獲取處理的參數後,傳遞給lib目錄下的webpack.js文件獲取編譯對象complier,然後complier調用run方法成功後,將編譯後的信息打印到屏幕上。入口文件webpack.js大體實現原理以下(僞代碼僅用於說明並不能實際運行):shell
webpack對參數的轉換處理都在這個文件中進行,過程稍微麻煩一些,咱們用流程圖的方式進行介紹。
數組
一、webpack首先會指定一個默認配置文件數組defaultConfigFiles,這個數據結構裏面存儲的是文件名稱和擴展名的對象,例如:數據結構
{path: e:/demo/webpack.config.js, ext: js}或者{path: e:/demo/webpack.config.js, ext: java}ui
二、程序判斷一下,用戶有沒有經過命令行指定其餘名稱的配置文件。webpack支持用戶使用如下的命令:spa
webpack --config example.config.js命令行
三、用戶經過config命令指定的文件或者是從默認配置數組中讀取的信息都會保存在configFiles數組中,數組中保存的對象的格式也是對象
{path: e:/demo/webpack.config.js, ext: js}
四、經過configFiles數組的長度,程序判斷用戶是否使用配置文件配置webpack。數組長度爲零,說明用戶沒有使用配置文件,entry和output信息須要從命令行中讀取;若是長度不爲零,那麼信息須要從配置文件和shell語句從進行讀取與合併,這時候程序會經過require的方式加載配置文件,讀取配置的對象或者數組。
五、使用processConfiguredOptions方法處理options,傳入的options參數大體有三種形式:1、空對象;2、普通對象;3、數組對象。
若是是空對象,說明是使用webpack <entry> [<entry>] <output>方式,這種方式,須要從argv._中獲取entry和output信息;
若是是普通對象,將普通對象和shell語句中傳入的參數進行合併處理
若是是數字對象,需遍歷每一個普通對象,進入普通對象的處理流程
處理完後,返回一個options對象或者options數組。