摘要:原文來自我的代碼拆分與動態(tài)導(dǎo)入當(dāng)項目越做越大時,體積過大導(dǎo)致加載速度過慢,性能問題直接影響用戶體驗。這時我們會考慮將代碼拆分。
原文來自我的github: https://github.com/Vibing/blog
代碼拆分與動態(tài)導(dǎo)入當(dāng)項目越做越大時,體積過大導(dǎo)致加載速度過慢,性能問題直接影響用戶體驗。
這時我們會考慮將代碼拆分。
拆分,顧名思義就是將一個大的東西拆分成N個小的東西,用公式表示就是:Sum = n * Sub
代碼拆分基于動態(tài)導(dǎo)入
什么是動態(tài)導(dǎo)入?就是我需要什么,你給我什么,我不需要的時候,你別給我,我嫌重。
動態(tài)導(dǎo)入可以將模塊分離成一個多帶帶的文件 在需要的時候加載進來。
對于動態(tài)導(dǎo)入,webpack 提供了兩個類似的技術(shù)。
第一種,也是優(yōu)先選擇的方式是,使用符合 ECMAScript 提案 的 import() 語法。
第二種,則是使用 webpack 特定的 require.ensure。
從webpack 2以后,一般使用第一種。
async-loadable由于import()方法返回的是Promise對象,我們?yōu)榱四芊奖愕姆祷亟M件,
這里推薦使用async-loadable插件
例子代碼:
import loadable from "async-loadable"; import Loading from "./my-loading-component"; const LoadableComponent = loadable({ loader: () => import("./my-component"), loading: status =>, }); export default class App extends React.Component { render() { return ; } }
代碼里有熟悉的 import() 方法。async-loadable 使用 webpack 的動態(tài)導(dǎo)入,調(diào)用loadable方法可以方便的返回要使用的組件。
下面我將以我本人的項目經(jīng)歷,來講解代碼拆分(code splitting)
代碼拆分前當(dāng)初還是小白的我,一開始哪知道有代碼拆分這個技術(shù)啊,就一個人負責(zé)一個小項目,一開始項目不大,跑起來也是嗖嗖的,這里先貼一下路由代碼:
import Home from "./home"; import Page1 from "./page1"; import Page2 from "./page2";
這里沒有使用動態(tài)導(dǎo)入,而是直接將所有頁面靜態(tài)引入進來,然后賦到對應(yīng)路由上。
這么做的壞處就是:打包時,整個項目所有的頁面都會打包到一個文件中,隨著頁面增多,這個文件也越來越大,最后我看了一下,達到了近25M(我嚇得打開度娘...)。
如果用一張圖來表示的話,這張圖在適合不過了:
哈哈,整個一坨有沒有。所有路由在這一坨紅色里,看著真特么憋屈啊
基于路由的代碼拆分打開度娘的我臉色漸漸有了好轉(zhuǎn),通過搜索,看到了webpack有個code splitting功能(代碼拆分),
前面說過,代碼拆分其實就是使用動態(tài)導(dǎo)入的技術(shù)實現(xiàn)的,那么我們就使用動態(tài)導(dǎo)入來優(yōu)化一把之前的路由:
import Loadable from "async-loadable"; import Loading from "./my-loading-component"; const Home = Loadable({ loader: () => import(`./home`), loading: Loading }); const Page1 = Loadable({ loader: () => import(`./page1`), loading: Loading }); const Paeg2 = Loadable({ loader: () => import(`./page2`), loading: Loading });} /> } /> } />
我們不再使用 import module from "url" 來靜態(tài)引入模塊,而是使用 loadComponent 來動態(tài)導(dǎo)入,它返回的是Loadable的結(jié)果,也就是我們想要的組件,我們把再把組件給對應(yīng)的路由,這就完成了基于路由的代碼拆分。
使用以后,鄙人懷著激動的心情開始打包項目,當(dāng)我看到控制臺的打包日志時,我的表情是這樣的:
咳咳,這種好事情當(dāng)然要分享一下啦,你要的結(jié)果:
可以看到,webpack打包時已經(jīng)將之前的一個臃腫文件按路由拆分成了三個文件,當(dāng)我們點擊一個路由時,會動態(tài)加載對應(yīng)的文件。
比如我點擊home頁面的路由時:
我再點擊page1時:
嗯,是按照路由來拆分的代碼,完美~
這樣看來,我們需要將之前的那張圖改成這樣的:
看著項目加載速度變快了,心里真特么高興
基于模塊拆分其實基于路由的代碼拆分已經(jīng)可以滿足絕大多數(shù)項目了,再大的項目也能滿足。
但隨著項目做的多了,慢慢的發(fā)現(xiàn)了一個問題:代碼浪費。
比如我要做一個Tab切換的功能,像醬紫的:
對應(yīng)的代碼大概是醬紫的:
import { Tabs } from "antd"; import TabOne from "./component/tab1"; import TabTwo from "./component/tab2"; import TabThree from "./component/tab3"; const TabPane = Tabs.TabPane; export default class Home extends Component { render() { return (); } }
Tab切換,每個前端小伙伴都做過,其實說白了,就是顯示隱藏的效果。
但是在這個頁面中,已經(jīng)把每個Tab里的代碼都加載進來了,如果用戶只看第一個Tab,其他Tab不點擊,就造成了代碼浪費。
如何解決這個問題呢?還是那句話:我需要什么,你給我什么,我不需要的時候,你別給我,我嫌重。
我們使用動態(tài)導(dǎo)入的方式改造一下代碼:
import { Tabs } from "antd"; import Loadable from "async-loadable"; import TabOne from "./component/tab1"; import Loading from "./component/loading"; const TabPane = Tabs.TabPane; const loadComponent = path => Loadable({ loader: () => import(`${path}`), loading: Loading }); const Tab2 = loadComponent("./component/tab2.tsx"); const Tab3 = loadComponent("./component/tab3.tsx"); export default class Home extends Component { render() { return (); } }
同樣 我們不再使用import module from "url"的方式,而是使用 loadComponent 方法動態(tài)導(dǎo)入。
由于TabOne是第一個默認顯示的,所以沒必要動態(tài)導(dǎo)入。
現(xiàn)在我們來點擊Tab 2看看效果:
非常棒,正是我們想要的。
再點擊Tab 3 :
簡直完美!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95356.html
摘要:按照的要求我需要將的坐標(biāo)拆分為多行。到這里相當(dāng)于將列中所有文本拆成了一個巨大的表,表中每個單元格有一個值。有些行拆分后的元素比較少,沒有值可以填充的單元格補充會把整個表逐行堆疊成一列。彩蛋我在列拆分為多行的基礎(chǔ)上,還將拆分成了兩個變量。 背景 手頭的項目要求用 Tableau 創(chuàng)建一個 story,數(shù)據(jù)集是摩拜上海城區(qū)用戶使用數(shù)據(jù)。其中有一個維度的數(shù)據(jù)處理起來有點棘手。 數(shù)據(jù)格式 sh...
摘要:拆分了錄屏代碼,監(jiān)控插件壓縮至,另外我們還原了部分,幫助用戶更方便地。請大家及時更新哈拆分錄屏代碼從版本開始,我們拆分了錄屏代碼。自從年雙十一正式上線,累計處理了億錯誤事件,付費客戶有金山軟件百姓網(wǎng)等眾多品牌企業(yè)。 摘要: BUG監(jiān)控插件壓縮至18K。 showImg(https://segmentfault.com/img/bVbpIPC?w=900&h=383); 1.7.1拆分了...
摘要:劃分標(biāo)準(zhǔn)根據(jù)稿,不同的展示模塊分為不同的組件。比如頂部底部導(dǎo)航列表等容器組件業(yè)務(wù)組件與數(shù)據(jù)源后臺本地存儲進行數(shù)據(jù)傳輸操作不止是劃分標(biāo)準(zhǔn)根據(jù)業(yè)務(wù)功能劃分。最常見的是列表組件。 為什么要拆分組件 提高可讀性、可維護性 如果不拆分 代碼量大,所有內(nèi)容集中在一起 相同組件無法復(fù)用 業(yè)務(wù)開發(fā)分工不明確,開發(fā)人員要關(guān)心非業(yè)務(wù)的代碼 改代碼時,可能會影響其他業(yè)務(wù),牽一發(fā)動全身(耦合) 任何一個操作...
摘要:初代架構(gòu)組成控制器視圖業(yè)務(wù)邏輯數(shù)據(jù)訪問實體業(yè)務(wù)實體數(shù)據(jù)訪問優(yōu)勢簡單粗暴缺點代碼臃腫職責(zé)混亂可維護性差可重用性差加入組成層層層業(yè)務(wù)實體數(shù)據(jù)訪問架構(gòu)相比初代架構(gòu)的優(yōu)勢把拆分為兩層和,職責(zé)分明代碼開始根據(jù)職責(zé)進行層級拆分,但未算拆分完整可維護性得 初代架構(gòu) 組成 1、jsp (控制器+視圖) 2、javabean (業(yè)務(wù)邏輯+數(shù)據(jù)訪問+實體) 業(yè)務(wù)Bean、實體Bean、數(shù)據(jù)訪問Bean...
閱讀 2676·2021-11-25 09:43
閱讀 2484·2021-09-22 15:29
閱讀 1000·2021-09-22 15:17
閱讀 3640·2021-09-03 10:36
閱讀 2236·2019-08-30 13:54
閱讀 1757·2019-08-30 11:23
閱讀 1171·2019-08-29 16:58
閱讀 1301·2019-08-29 16:14