天天看點

webpack項目瘦身之移除無依賴檔案

作者:閃念基因
webpack項目瘦身之移除無依賴檔案

背景

 作者在開發過程中,有遇到以下此場景:

 PM:請把關于出價場景的邏輯優化下,在出價前進行判斷是否命中風控。

 FE:安排。

 在開發過程中,經常會通過搜尋關鍵詞來快速找到對應檔案。此次也不例外,當在代碼倉庫搜尋時,結果卻有多個對應檔案。經過長時間的排查驗證發現有些檔案是沒有被引用的,影響了開發效率。

能不能通過一種方式來提高此類問題的開發效率?

拆解問題

表面原因

 項目倉庫存在未引用的檔案,幹擾開發人員的判斷,影響開發效率。

未引用的檔案一開始就是未被引用的?

深層原因

 人為原因,需求疊代過程中,未及時移除或者标記無用檔案。

 對于深層原因,不再叙述,因地制宜。

 接下來主要聊聊表面原因如何解決,有沒有方法可以将倉庫中無用的檔案檢索出來并适當移除?

分析整理

 建構工具:webpack

 技術棧:vue、react

 基于這些,可以劃定解決的方向:基于webpack搭建的vue或者react項目。

 webpack官網有這麼一段話:

 本質上,webpack 是一個用于現代 JavaScript 應用程式的 靜态子產品打包工具。當 webpack 處理應用程式時,它會在内部從一個或多個入口點建構一個 依賴圖(dependency graph),然後将你項目中所需的每一個子產品組合成一個或多個 bundles,它們均為靜态資源,用于展示你的内容。

 這段話有提到依賴圖,也是解決問題的突破口。大緻如下圖:

webpack項目瘦身之移除無依賴檔案

思路

 整體思路如上圖,接下來将圍繞三個方向去細聊下。

  • 如何擷取所有檔案
  • 如何擷取依賴檔案
  • 如何擷取無用檔案

設計思路

如何擷取所有檔案

 所有檔案是指什麼?

 是指能覆寫webpack建構時依賴檔案的集合。通俗的講就是[所有檔案]的檔案數量一定大于等于[依賴檔案]的檔案數量。

 使用webpack建構時是需要指定入口檔案的位置。比如vue的項目通常為[src/main.js],同時大多數依賴檔案都會放在[src/**]檔案夾下。

 基于此思考,參考vue與react項目目錄結構,需要設計[所有檔案]的擷取入口位置,預設為src,可通過配置參數傳入。

 讀取檔案的實作可以使用node能力。通過node遞歸讀取指定入口目錄下的所有檔案。

webpack項目瘦身之移除無依賴檔案

node讀取檔案

如何擷取依賴檔案

 簡介上有這麼一句話:webpack 提供了多種接口來自定義編譯過程。

 而webpack又是基于依賴分析的建構方式。

 結合這些就可以在編譯過程中擷取到目前的依賴檔案。

 擷取并不複雜,webpack的插件接口允許使用者直接介入編譯過程,隻需開發一個自定義插件,在合适的編譯階段執行即可。

 目标是擷取依賴檔案集合,故可以在webpack編譯完成後,即将退出時搞些事情。查閱plugins相關鈎子,确定使用compiler鈎子下的done鈎子。

done鈎子: 在 compilation 完成時執行。
webpack項目瘦身之移除無依賴檔案

擷取依賴檔案

如何擷取無用檔案

 截止目前,已經擷取到兩份資料:[所有檔案]與[依賴檔案]。

 那麼無用檔案就很簡單,隻要将依賴檔案從所有檔案剔除,剩餘的既是無用檔案~

方案複盤

 通過上述流程,已經可以滿足目前訴求。

 不過在反複測試驗證過程中,發現一些不足并進行了優化。比如:

  • 支援輸出執行的檔案記錄日志
  • 支援自動删除無用檔案
  • 支援分析指定類型結尾的檔案
  • 支援忽略無需分析的檔案夾
  • 其他優化

 詳細代碼可以參考:https://s1.zhuanstatic.com/common/u/article-dependencyAnalysisPlugin.js

結語

 發現問題、設計方案、解決問題,共勉~

作者:魯寬寬

來源:微信公衆号:大轉轉FE

出處:https://mp.weixin.qq.com/s/hHUJp3hyWVn6Iqplcuaj8Q