當前市面上大部分前端應用都是基於webpack進行構建,而隨着應用日益龐大,webpack應用就會出現構建速度慢,構建結果體積大等一系列問題。javascript
隨着應用的不斷迭代,webpack應用最多見的兩個問題就是:css
有一個很簡單的劃分方式,就是以構建(build)爲分界線,分紅前向治理和後向治理:前端
咱們的治理方向,就是圍繞前向治理和後向治理。java
前向治理的核心概念,就是一個字 快
,目的就是提高構建速度,市面上大部分webpack優化文章都是這一類提高構建速度的文章,因此這裏就簡單介紹一些不錯的實踐webpack
數據先行,經過speed-measure-webpack-plugin採集性能指標,能夠獲得webpack在整個編譯過程當中在loader、plugin上花費的時間,基於該數據能夠專項的進行優化和治理。git
若是經過SMP分析得知在loader編譯過程耗時較多,那麼能夠在覈心loader,例如babel-loader中添加緩存。github
{ loader: 'babel-loader', options: { cacheDirectory: true } } 複製代碼
若是經過SMP分析得知在loader編譯過程耗時較多,還能夠經過使用happyPack,開啓多線程編譯,提高開發效率。web
dll能夠簡單理解成提早打包,例如lodash、echarts等大型npm包,能夠經過dll將其提早打包好,這樣在業務開發過程當中就不用再重複去打包了,能夠大幅縮減打包時間。npm
webpack5利用 持久緩存
來提升構建性能,或許升級webpack後,前述的各類優化,都將成爲歷史。json
後向治理主要保證構建結果的質量
很常見的就是webpack-bundle-analyzeer,提供打包結果的可視化展現,如上圖給予的決策幫助是:
業務開發過程當中,隨着業務迭代,常常有些文件、模塊及代碼被廢棄,這些廢棄代碼隨着時間推移,將逐漸變爲歷史包袱,因此針對構建後結果,咱們要作的就是清理其中的deadcode。
前面webpack-bundle-analyzeer雖然是最經常使用的插件,但依舊有一些缺陷:
tree-sharking你們都瞭解,搖掉不須要的代碼,作爲最終的輸出結果,但反過來講,這些廢棄代碼依舊在本地真實不虛的存在着。
因此如何能準確的清理掉deadcode呢?這就須要經過webpack的 統計信息(stats)
來進行更細節的分析
stats是經過 webpack 編譯源文件時,生成的包含有關於模塊的統計數據的 JSON 文件,這些統計數據不只能夠幫助開發者來分析應用的依賴圖表,還能夠優化編譯的速度。
webpack --profile --json > compilation-stats.json
複製代碼
經過上述全局命令便可輸出統計信息,例如:
{ "version": "1.4.13", // Version of webpack used for the compilation "hash": "11593e3b3ac85436984a", // Compilation specific hash "time": 2469, // Compilation time in milliseconds "filteredModules": 0, // A count of excluded modules when `exclude` is passed to the `toJson` method "assetsByChunkName": { // Chunk name to emitted asset(s) mapping "main": "web.js?h=11593e3b3ac85436984a", "named-chunk": "named-chunk.web.js", "other-chunk": [ "other-chunk.js", "other-chunk.css" ] }, "assets": [ // A list of asset objects ], "chunks": [ // A list of chunk objects ], "modules": [ // A list of module objects ], "errors": [ // A list of error strings ], "warnings": [ // A list of warning strings ] } 複製代碼
經過對modules和chunks加以分析,就能夠獲得webpack完整的依賴關係,從而梳理出廢棄文件及廢棄代碼,同時也能夠根據業務形態進行定製。
前面提到分析stats.json,但由於是原始數據,數據量比較大,有必定處理和清洗成本,因此可使用開源的webpack-deadcode-plugin這個插件
lint能夠快速的掃描出未使用的變量,這可以極大的提高咱們的deadcode清理效率。
頓時整個應用乾乾淨淨,舒舒服服!