從 Webpack 4 開始,默認狀況下使用 terser 壓縮生產環境下的輸出結果。Terser 是一款兼容 ES2015 + 的 JavaScript 壓縮器。與 UglifyJS(許多項目的早期標準)相比,它是面向將來的選擇。有一個 UglifyJS 的分支—— uglify-es,但因爲它再也不維護,因而就從這個分支誕生出了一個獨立分支,它就是 terser。css
儘管 webpack 4 默認狀況下會壓縮輸出,但若是您想進一步調整壓縮行爲或更換壓縮器,那麼,最好了解如何自定義壓縮。html
所謂壓縮就是將代碼變的更小,安全轉換是指經過重寫代碼而不改變代碼邏輯。這方面的好例子包括重命名變量,甚至是刪除整個的訪問不到的代碼塊(if (false)
)。前端
不安全的轉換可能會破壞代碼,由於它們可能會丟失底層代碼所依賴的隱含內容。例如,Angular 1在使用模塊時須要特定的函數參數命名。除非在這種狀況下采起預防措施,不然重寫參數會破壞代碼。java
在 Webpack 4 中,經過兩個配置字段控制壓縮過程:optimization.minimize
字段切換壓縮處理器,而 optimization.minimizer
數組用來配置壓縮處理器。webpack
爲了調整默認值,咱們將 terser-webpack-plugin 附加到項目中,以即可以調整它。git
首先,請將插件包含在項目中:github
要將其附加到配置,請首先爲其定義一個局部配置:web
webpack.parts.jsnpm
將其合併到主配置:
webpack.config.js
若是如今執行 npm run build
,您應該看到與以前相同的結果。
默認狀況下禁用源映射。您能夠經過
sourceMap
標誌啓用它們。您應該檢查 terser-webpack-plugin 以獲取更多選項。
要調整 Terser,請附加
terserOptions
相關選項到插件中。
雖然默認值和 terser-webpack-plugin 適用於此用例,但您能夠考慮更多選項:
特定的解決方案容許您預處理代碼,以便它運行得更快。它們補充了壓縮技術,能夠分爲範圍提高,預處理和提高解析。這些技術有時可能會增長總體包的大小,同時加快代碼的執行速度。
從 Webpack 4 開始,它默認在生產環境下使用做用域提高。它將全部模塊提高到單個範圍,而不是爲每一個模塊編寫單獨的閉包。這樣作會減慢構建速度,但會爲您提升包的執行速度。在 Webpack 博客上閱讀有關做用域提高的更多信息。
將
--display-optimization-bailout
選項傳遞給 Webpack 以獲取與提高結果相關的調試信息。
prepack-webpack-plugin 使用 Prepack,一個JavaScript 局部執行器。它重寫了能夠在編譯時完成的計算,從而加快了代碼執行速度。另請參閱 val-loader 和 babel-plugin-preval 以獲取其餘解決方案。
optimize-js-plugin 經過包裝當即執行函數的方式補充了其餘解決方案,它加強了 JavaScript 代碼最初解析的方式。該插件依賴於 Nolan Lawson 的 optimize-js。
若是您使用 html-loader 處理 HTML 模板,則可使用 posthtml 對模板進行預處理。您還可使用 posthtml-minifier 壓縮 HTML。
clean-css-loader 使您可使用流行的 CSS 壓縮器 clean-css。
optimize-css-assets-webpack-plugin 是一個基於選項的插件,能夠在 CSS 資源上應用選定的壓縮器。使用 MiniCssExtractPlugin
可能致使重複的 CSS,由於它只合並文本塊。OptimizeCSSAssetsPlugin
經過對生成的結果進行操做來避免這個問題,從而能夠產生更好的結果。
在可用的解決方案中,OptimizeCSSAssetsPlugin
最好的選擇了。要將其添加到配置中,請先安裝它和 cssnano:
與 JavaScript 同樣,您能夠將該想法包含在部分配置中:
webpack.parts.js
若是您使用 構建分析章節中討論的
--json
做爲 Webpack 輸出選項,則須要設置canPrint: false
而後,合併到主配置:
webpack.config.js
若是您如今構建項目(npm run build
),您應該注意到 CSS 已經變得更小,由於註釋也被去掉了:
compression-webpack-plugin 容許您將生成壓縮文件的問題交給 Webpack 處理,從而可能節省服務器上的處理時間。
咱們可使用 img-loader、imagemin-webpack 和 imagemin-webpack-plugin 來減少圖像大小。這些包會在底層使用一些圖片優化處理器。
如同在性能章節中討論的那樣使用 cache loader 和 thread-loader 是一個好主意,由於它們具有更多的操做空間。
壓縮是您能夠採起的最溫馨的步驟,以使您的構建更小。回顧一下: