打包最佳化實踐(如何Code Spliting)
專案地址:
使用 webpack 外掛找出佔用空間較大的包
開發環境中可使用 觀察各模組的佔用情況。以該專案為例:瀏覽器中輸入 可以看到如下效果:
image
按需載入
對模組結合 babel 進行;
測試 day.js 替代 moment.js. 實際上 moment.js 也使用 了(實驗減少了 40KB+),所以最終結果相差不大;
code-spliting
使用 MiniCssExtractPlugin 外掛分離 JavaScript 和 Css 檔案:
823.94 KB build / static / js / main.496a38b7.js 8.2 KB build / static / css / main.css
code-spliting 官方給出三種方案,分別如下:
方案一:在 entry 處增加打包入口
方案一的缺點如下:
如果多個檔案引人了相同的包(比如 lodash),引用的包會被分別打包兩次;
這種方案不夠靈活,無法根據邏輯動態分割程式碼;
所以方案一通常會結合方案二、方案三一起使用,方案一的配置大致如下:
entry: [require.resolve('./polyfills'), paths.appIndexJs],// 也可以寫成entry: { polyfill: require.resolve('./polyfills'), IndexJs: paths.appIndexJs, },
方案二:使用外掛 SplitChunkPlugin
optimization: { runtimeChunk: false, splitChunks: { cacheGroups: { vendor: { chunks: 'all', test: /[\/]node_modules[\/]/, name: 'vendor', maxAsyncRequests: 5, priority: 10, enforce: true, }, }, }, },
打包效果如下:
723.96 KB build/static/js/vendor.a9289a29.chunk.js // node-modules 模組 98.72 KB build/static/js/main.7bcaca24.js 8.2 KB build/static/css/1.css
此時將 node-modules 裡的包打包成了一個大塊頭,這樣對載入仍然是不友好的。解決方案為:將核心的框架單獨打包出來,剩餘模組非同步載入,比如可以使用 )。
optimization: { runtimeChunk: false, splitChunks: { cacheGroups: { vendor1: { // 主要模組 chunks: 'all', test: /[\/]node_modules[\/](react|react-dom|antd)[\/]/, name: 'vendor1', maxAsyncRequests: 5, priority: 10, enforce: true, }, vendor2: { // 次要模組 chunks: 'all', test: /[\/]node_modules[\/]/, name: 'vendor2', maxAsyncRequests: 5, priority: 9, enforce: true, reuseExistingChunk: true, }, }, }, }
打包效果如下:
588.06 KB build/static/js/vendor2.d63694f4.chunk.js 133.17 KB build/static/js/vendor1.0d40234c.chunk.js 98.72 KB build/static/js/main.b7a98d03.js 8.2 KB build/static/css/2.css
可以看到此時 node_modules 包已經被拆分成了核心模組和非核心模組。
使用動態引入語法 import()
首先使用官網安利的 這個包,它的思想是根據路由
(代替模組)進行程式碼的動態分割,非同步載入所需要的元件,從而極大地提高頁面載入速率。
在路由介面進行如下配置:
const Loading = () =>Loading...const Home = Loadable({ loader: () => import('../pages/home'), loading: Loading, })// 類似這樣使用路由
我們來看程式碼分割後的結果:
這裡測試結果是去掉方案二的配置後進行的,實驗對比後,使用方案三的方式稍優於方案二、三共同使用的方式。
235.89 KB build/static/js/IndexJs.57ee1596.js 225.94 KB build/static/js/15.c09a5919.chunk.js 138.18 KB build/static/js/17.30c26142.chunk.js 82.71 KB build/static/js/1.667779a6.chunk.js 57.55 KB build/static/js/16.f8fa2302.chunk.js 16.46 KB build/static/js/2.e7b77a5d.chunk.js 14.79 KB build/static/js/18.cad1f84d.chunk.js 12.51 KB build/static/js/0.73df11a7.chunk.js 11.22 KB build/static/js/13.19501c58.chunk.js 8.34 KB build/static/js/5.33fd1c35.chunk.js 7 KB build/static/js/8.9f1d0a47.chunk.js 5.86 KB build/static/js/12.24f0a7ec.chunk.js 5.06 KB build/static/css/18.css 4.97 KB build/static/js/polyfill.1c61a660.js 3.58 KB build/static/js/7.dd4976e3.chunk.js 3.53 KB build/static/js/14.16f6b811.chunk.js 3.42 KB build/static/css/17.css 2.98 KB build/static/js/10.464a61e4.chunk.js 2.02 KB build/static/js/11.3728d5a9.chunk.js 1.45 KB build/static/js/6.92fbac58.chunk.js 1.13 KB build/static/js/9.59160a3a.chunk.js
有多少個路由,react-loadable 庫就自動幫我們多拆分了多少個包檔案。可以想象在越大的專案中,這種動態引人庫的好處越明顯。
image
而且可以很清晰的看到,當我們在 /home 下,只有 home 元件是被載入的,其他元件並沒有被載入!
那麼 react-loadable 的神秘之力是如何實現的呢,它本質上是個運用了屬性代理的高階函式,透過在高階函式里配合 import()
加進各種狀態,從而達到非同步載入模組的效果。
作者:牧云云
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/200/viewspace-2814666/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Vue打包優化之code splitingVue優化
- 按需載入(code spliting)
- Code Review最佳實踐View
- Flutter 多渠道打包實踐Flutter
- Show me the code,babel 7 最佳實踐!Babel
- Taro編譯打包優化實踐編譯優化
- Webpack原理與實踐(一):打包流程Web
- React — 打包最佳化React
- Vue — 打包最佳化Vue
- Golang效能最佳化實踐Golang
- fastlane 自動化打包工具實踐AST
- webpack打包最佳化方案Web
- 頁面CLS 最佳化實踐
- 【整理】CocoaPods打包私有庫實踐 | 最新版
- webpack專案開發完後,如何最佳化打包速度?Web
- HarmonyOS:應用效能最佳化實踐
- MySQL8.0效能最佳化(實踐)MySql
- Code Review 在丁香醫生前端團隊的實踐View前端
- 前端效能最佳化實踐方向與方法前端
- 影片生產大映象最佳化實踐
- Hadoop YARN:排程效能最佳化實踐HadoopYarn
- iOS如何實現自動化打包iOS
- 最佳化您的部署:Docker 映象最佳實踐Docker
- 8個雲成本最佳化的最佳實踐
- Mysql事務原理與最佳化最佳實踐MySql
- 14個Flink SQL效能最佳化實踐分享SQL
- Gradle多渠道打包的原理、實踐與輔助開發Gradle
- 抖音大型直播的畫質最佳化實踐
- 一種KV儲存的GC最佳化實踐GC
- vivo 短影片體驗與成本最佳化實踐
- 探索Terraform實踐:最佳化基礎設施管理ORM
- 抖音世界盃的畫質最佳化實踐
- 達達快送小程式效能最佳化實踐
- 京東雲TiDB SQL最佳化的最佳實踐TiDBSQL
- TiDB 效能分析&效能調優&最佳化實踐大全TiDB
- Redis大叢集擴容效能最佳化實踐Redis
- 研效最佳化實踐:WeTest提效測試
- 研發團隊資源成本最佳化實踐