前語--最近公司新開了一個項目,對webpack的性能上產生了不小需求,在一通學習了webpack以後特地寫一篇來總結一下。
本文涉及的內容node
對於項目bundle的分析,咱們能夠藉助 webpack-bundle-analyzer webpack
食用方法:git
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
}複製代碼
咱們只須要在每次打包的時候使用它,能夠經過判斷NODE_ENV === 'production' 來選擇是否要開啓該插件。同類型的插件還有 webpack-analyse 和 webpack-chart, 更炫酷(霧)一些不過額外要配置下。運行下面的命令生成分析工具須要的json文件。github
webpack --profile --json > stats.json
// 若是,運行指定的 weboack 文件,可用此命令
webpack --config build/webpack.prod.conf.js --profile --json > stats.json
複製代碼
有了依賴分析圖,咱們就知道哪些模塊是致使咱們性能存在瓶頸的罪魁禍首,必不可缺的依賴咱們能夠考慮是否有按需加載的可能, 沒有必要或者功能重複的依賴咱們就能夠將它剝離。web
① 按需加載
npm
一是將所使用的庫按需加載,好比一個UI庫小至100K,大至上MB。咱們一般不會使用她全部的組件而是隻使用其中一部分,這時就能夠將所使用的組件提取出來,而不打包沒有使用到的多餘組件。json
在咱們導入組件庫的時候不使用--緩存
這種引入方式會致使將整個組件庫都導入進來,得不償失。bash
正確的食用方法--babel
在引入須要的組件時都只將該組件引入進來,而不使用解構。
but 這樣是否是特別麻煩,每次引入文件都須要去對應的文件下面導入文件。特別是一般組件庫都是咱們經過npm下載下來的,都放在node_modules下面。很是不利於咱們準確的找到須要的組件。so 咱們可使用 babel-plugin-import 來幫咱們自動完成。這樣使用第一種引入方式也不會將全部的組件都導入進來。
二是將代碼分塊(chunk), 實現代碼層面上的按需加載--
使用webpack的Code splitting來實現, 具體展開來說篇幅過長。直接 webpack的 Code splitting 實現按需加載。But 這是一種過期的方法-- 咱們在webpack導入對應的模塊可使用ES6+的import()。將代碼動態拆分。 webpack動態導入
Tips: Scope Hoisting
這個是webpack自帶的一個插件,只需在配置文件中添加一個新的插件,就可讓 Webpack 打包出來的代碼文件更小、運行的更快。 可是通過我測試效果微乎其微,選裝。
食用方法--
項目工程的構建速度決定咱們能不能 happy coding,長足的構建速度也能加快咱們的開發進度。在構建速度上主要分爲倆個優化方面--
① 首次編譯構建速度
HappyPack加速構建
總所周知,JS是單線程的,而node在不展開cluster的狀況下也是默認單線程的。單線程的優點這裏不詳談,happypack可讓 Webpack 能同一時間處理多個任務,發揮多核 CPU 電腦的威 力,它把任務分解給多個子進程去併發的執行,子進程處理完後再把結果發送給主進程。大大提高了編譯的速度.
食用方法--
happypack的處理思路是將原有的webpack對loader的執行過程從單一進程的形式擴展多進程模式,本來的流程保持不變,這樣能夠在不修改原有配置的基礎上來完成對編譯過程的優化。
打包DLL抽離公共類庫
經過前置依賴包使得不常更新的包不參與打包來提高構建速度,只須要build本身的業務代碼。這樣就能省下公共資源和公共依賴的打包時間,大大加快構建速度。
食用方法--
像是經過前置依賴和緩存依賴的方法還有 Externals, CommonsChunk。
② 熱重載構建速度(rebuild)
快速的rebuild速度可以在開發中帶來更多的幸福感,在這一方面咱們能夠藉助webpack的cache(默認開啓),babel的cache,happypack的cache。
babel.cache--
使用babel將代碼編譯成es5的時候,可使用exclude和include限定babel和排除node_modules下的下賴來提高構建速度。
happypack.cache--
若是在體積優化和構建方面都作到位了,打包時的速度其實就會很是的快樂。而咱們在打包時能作的優化其實前面都作得差很少了,
在這步最多對文件壓縮(webpack-parallel-uglify-plugin)和文件搜索目錄深度(resolve-modules)進行一些優化。這裏就再也不過多贅述了。