摘要:的生產環境優化完整配置的可以參考本文主要介紹了生產環境我都做了哪些優化文章的結構如下靜態資源路徑。分配不同的關于穩定性的坑注意區分整個項目有變動時,變化。而生產環境可以這一項,因為我們不需要在生產環境調試代碼。
webpack4 的生產環境優化
webpack4完整配置的可以參考: https://github.com/ziwei3749/...
本文主要介紹了 webpack4 生產環境我都做了哪些優化
文章的結構如下:
1.靜態資源路徑。
2.hash 緩存。
3.代碼分割。
4.壓縮混淆代碼。
5.開啟 gzip 壓縮。
6.關閉 devtool。
7.Tree Shaking
1.靜態資源路徑。對靜態資源路徑的處理和驗證靜態資源包括: js css image,
靜態資源的路徑的組成: 前綴 + 自己設置的路徑
前綴 :靜態資源的路徑配置的前綴通過 output.publicPath 設置
關于publicPath的解釋 https://juejin.im/post/5ae9ae...
自己設置的路徑
js 的路徑配置
js 的路徑配置在 output.filename
output: { path: path.resolve(__dirname, "../dist"), filename: "static/js/[name].[contenthash:8].js" }
css 路徑配置
css 的路徑配置在分離 css 的插件里。例如之前的 extract-text-webpack-plugin 或者 mini-css-extract-plugin
plugins: [ new MiniCssExtractPlugin({ filename: "static/css/[name].[contenthash:8].css" }) ];
image 路徑配置
img 的路徑配置在 url-loader 里配置
modules: { rules: [ { test: /.(png|jpe?g|gif|svg)(?.*)?$/, use: [ { loader: "url-loader", options: { limit: 10000, name: "static/images/[name].[hash:7].[ext]" } } ] } ]; }
ps: 有的前端同學,可能像我一樣不太清楚如何驗證打包壓縮后的的文件內路徑配置的是否正確
推薦一個簡單的方法。下載 express 項目腳手架生成一個 node 項目,將打包后的 dist 扔到 public,啟動 node 服務器
npm install express-generator -D
當然也可以直接去打開 dist 文件夾里的路徑,去確實路徑是否正確。
2.hash 緩存。將業務代碼、第三方類庫、runtime 代碼、css 多帶帶打包,給他們不同 hash,來最大化利用緩存
webpack3 中分離業務代碼、第三方類庫需要用 CommonChunksPlugin。
webpack4 的新增 optimization,可以方便的分離代碼,而且 hash 的穩定性的問題也有改進。
多帶帶打包業務代碼、第三方類庫、runtime
optimization: { splitChunks: { // 打包 node_modules里的代碼 chunks: "all" }, runtimeChunk: true, // 打包 runtime 代碼 }
多帶帶打包 css 代碼
webpack4 推薦 mini-css-extract-plugin
注意: 之前的 extract-text-webpack-plugin 需要 beta 版本才支持,而且 contenthash 無法使用。
分配不同的 hash
關于 hash 穩定性的坑
注意區分
[hash] : 整個項目有變動時,hash 變化。
[chunkhash] : chunk 有變動,chunkhash 變化
[contenthash] : 目前文檔沒有明確定義和說明,但是和文件內容的變化相關
在分離 js 和 css 時,都用設置 contenthash.
output: { path: path.resolve(__dirname, "../dist"), filename: "static/js/[name].[contenthash:8].js", publicPath: "/" },
new MiniCssExtractPlugin({ filename: "static/css/[name].[contenthash:8].css" }),
配置js的文件名時,之前webpack3都是用chunkhash也沒問題,但是實踐后發現webpack4中用chunkhash,會導致,修改css時引發js的chunkhash變化,從而緩存失效。
經測試這樣的設置,的確可以分離打包,并且各自的 hash 值互相不會干擾,如果有問題的話,可以共同討論
3.代碼分割代碼分割或者說懶加載,是 webpack 從誕生就一直標榜的功能吧。
它的作用就是把 js 分割成幾份,在用戶需要加載時才加載,這樣不用一次性加載所有 js。
那么在 webpack 里實現代碼分割并不是用配置的方式,而是通過我們寫代碼的方式來告訴 webpack 哪些代碼要分割
webpack 里有 2 種 webpack 分割方法
webpack 內置方法 : require.ensure() 和 require.include()
es2015 定義的 動態 import,import 返回 promise
require.ensure 使用 demo
// require.ensure()的 4 個參數 : []依賴 、 callback 、 errorCallback 、 chunkName require.ensure( ["./subPageA"], () => { var subPageA = require("./subPageA"); }, "subPageA" ); // require.include("./moduleA.js")可以提取異步模塊中的公共部分到父chunk
import 使用 demo
import("./subPageA").then(subPageA => { console.log(subPageA); }); // 區別 // import("./subPageA")會直接執行這個文件, // 而require.ensure()不會直接執行,是在里面的回調函數里才執行的引入操作。
關于import的使用注意
@babel升級后,使用import的語法,需要下載插件 @babel/plugin-syntax-dynamic-import 以下的地址鏈接 https://babeljs.io/docs/en/next/babel-plugin-syntax-dynamic-import.html4.壓縮混淆代碼
聽說webpack4只需要設置mode:produciton,就自動打包混淆js代碼啦!
很好,現在我們只需要壓縮css了可以了呢,于是下載插件optimize-css-assets-webpack-plugin
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin")
optimization: { splitChunks: { chunks: "all" }, runtimeChunk: true, minimizer: [ new OptimizeCssAssetsPlugin({}) ] },
new OptimizeCssAssetsPlugin({ assetNameRegExp: /.optimize.css$/g, cssProcessor: require("cssnano"), cssProcessorOptions: { safe: true, discardComments: { removeAll: true } }, canPrint: true }),
再看一眼我們的代碼,坑爹的發現js的壓縮居然失效了。
為什么呢?我在問答社區看到類似的問題,并且在官方文檔找到了解釋。
大致意思就是。默認optimization.minimize是true,所以js可以自動幫你壓縮
但是自定義minimizer后,webpack默認配置會取消掉。
文檔還很皮的告訴你,如果你用了css壓縮,記得自己用uglifyjs壓縮js呀。。。
https://segmentfault.com/a/11...
https://webpack.js.org/plugin...
總之,還是要自己用uglifyjs配置后壓縮js
minimizer: [ new OptimizeCssAssetsPlugin({}), // 壓縮 css,使用minimizer會自動取消webpack的默認配置,所以記得用UglifyJsPlugin new UglifyJsPlugin({ // 壓縮 js uglifyOptions: { ecma: 6, cache: true, parallel: true } }) ]5.開啟 gzip 壓縮。
開啟gzip壓縮,那么壓縮的好處是什么?
可以減小文件體積,傳輸速度更快。
服務端發送 response 時可以配置 Content-Encoding:gzip,用戶說明數據的壓縮方式
瀏覽器接受時,就可以根據相應個格式去解碼。客戶端請求時,可以用 Accept-Encoding:gzip,用戶說明接受哪些壓縮方法
所以 gzip 格式在 http 中傳輸文件的話,速度更快。那么誰來壓縮文件?
不是服務端,就是客戶端咯。
服務端比如 ngix 或者 node 去做壓縮,
也可以 webpack 打包上線時,通過插件去做壓縮。
服務端響應時壓縮,肯定不如應用構建時壓縮更合適。因為壓縮也是要有時間開銷的
const CompressionWebpackPlugin = require("compression-webpack-plugin"); webpackConfig.plugins.push( new CompressionWebpackPlugin({ asset: "[path].gz[query]", algorithm: "gzip", test: new RegExp(".(js|css)$"), threshold: 10240, minRatio: 0.8 }) )
壓縮之后,文件體積減少的確顯著。
6.關閉devtooldevtool我沒有做很深入的研究。
我的理解,開發環境必須要配置,否則肯定無法調試。
而生產環境可以這一項,因為我們不需要在生產環境調試代碼。如果理解有誤,歡迎指正哈~
7.Tree shakingtree shaking 的原理
ES6 的模塊是靜態分析的。所以在編譯時可以判斷哪些代碼沒有 exports
分析程序流,判斷哪些變量沒有被使用、從而刪除代碼
webpack4的新增了sideEffects來指定“有副作用的文件”,
但是我在實際使用時,遇到一些坑,比如這樣配置后,我意思是指定.css文件不要被“搖”掉。
但這個配置依舊導致了css文件打包后被當做冗余代碼被刪除。
"sideEffects": [ "*.css" ],
關于tree shaking就貼一篇文章。關于tree shaking研究清楚后再更新吧
https://zhuanlan.zhihu.com/p/...
以上就是整個配置的說明啦,目前tree shaking目前還沒有搞定,其他功能我自己測試是沒有問題的。
貼一份,webpack4完整的配置文件的地址。
如果覺得有幫助希望star一下,如果遇到問題,也歡迎指教!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96477.html
摘要:當下最流行的模塊打包器于年月日正式發布版本,代號。從官方的發布日志來看本次大版本更新帶來了很多新特性更新和改善,這將會讓的配置更加簡單。本文,筆者將會全面介紹的新特性及實踐。只支持模塊,目前處于試驗階段。 導語: webpack是一個JS應用打包器, 它將應用中的各個模塊打成一個或者多個bundle文件。借助loaders和plugins,它可以改變、壓縮和優化各種各樣的文件。它的輸入...
摘要:功能強大,有很多獨特的功能,但其中一個難點是配置文件。為此團隊改變了這一現狀默認不需要配置文件。每個選項的默認配置如下指兩個配置項都存在的屬性中解決了的會被刪除刪除空的合并重復的調試緩存模塊避免在未更改時重建它們。 webpack功能強大,有很多獨特的功能,但其中一個難點是配置文件。為此,webpack團隊改變了這一現狀:webpack 4默認不需要配置文件。可以通過mode選項為we...
摘要:中在性能優化所做的努力,也大抵圍繞著這兩個大方向展開。因此,將依賴模塊從業務代碼中分離是性能優化重要的一環。大型庫是否可以通過定制功能的方式減少體積。這又違背了性能優化的基礎。接下來可以抓住一些細節做更細的優化。中,為默認啟動這一優化。 前言:在現實項目中,我們可能很少需要從頭開始去配置一個webpack 項目,特別是webpack4.0發布以后,零配置啟動一個項目成為一種標配。正因為...
摘要:今天就嘗試著一起來聊聊吧,旨在幫大家加深理解新手更容易上路,都能從到搭建配置自定屬于自己的腳手架,或對已封裝好的腳手架有進一步的鞏固,接下來蘇南會詳細講解中的每一個配置字段的作用部分為新增。 showImg(https://segmentfault.com/img/bVbjmMV?w=1008&h=298); 前言 經常會有群友問起webpack、react、redux、甚至cre...
摘要:它允許在運行時更新各種模塊,而無需進行完全刷新。構建生產環境開發環境和生產環境的構建目標差異很大。在開發環境中,我們需要具有強大的具有實時重新加載或熱模塊替換能力的和。 1. 構建開發環境 如果你一直跟隨我前面的博文,那么你對webpack的基礎知識已經有比較深刻的理解了。之前,我們一直執行著: npm run build 來打包編譯輸出我們的代碼,本文我們來看看如何構建一個開發環境,...
閱讀 2571·2021-11-22 09:34
閱讀 932·2021-11-19 11:34
閱讀 2801·2021-10-14 09:42
閱讀 1472·2021-09-22 15:27
閱讀 2385·2021-09-07 09:59
閱讀 1731·2021-08-27 13:13
閱讀 3432·2019-08-30 11:21
閱讀 771·2019-08-29 18:35