使用react-loadable實現(xiàn)代碼分割

(本文為學(xué)習記錄,如有錯誤謝謝指出王凑,高手勿噴)

在開發(fā)react單頁面應(yīng)用時兰绣,我們會遇到一個問題世分,那就是打包后的js文件特別巨大,首屏加載會特別緩慢狭魂。這個時候我們應(yīng)該講代碼進行分割罚攀,按需加載党觅,將js 拆分成若干個chunk.js,用到就加載雌澄,react-loadable就可以很好地解決這個問題。

安裝

$ yarn add react-loadable

基本使用

假設(shè)現(xiàn)在項目中有個 home頁面組件

src/pages/home/index.js

import React, { Component } from 'react'
class Home extends Component {
    render(){
        return (
            <div>這個是home頁面</div>
        )
    }
}

export default Home

在沒有使用react-loadable之前杯瞻,在我們的route.js里面是直接import Home這個組件的

router.js

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'

import Home from '@pages/home'

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

運行項目后我們可以看chrome的network記錄

image

可以看到1.chunk.js是687k

現(xiàn)在我們來添加react-loadable

在home文件下新建一個loadable.js文件

src/pages/home/loadable.js

import React from 'react';
import Loadable from 'react-loadable';

//通用的過場組件
const loadingComponent =()=>{
    return (
        <div>loading</div>
    ) 
}


export default Loadable({
    loader:import('./index.js'),
    loading:loadingComponent
});

然后再router里面調(diào)用

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'

import Home from '@pages/home/loadable'

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

現(xiàn)在再看看chrome的network記錄

image

這個時候1.chunk.js是156k镐牺,因為只加載首頁所需的依賴,所以體積會小很多魁莉,而且這個差距會隨著項目的增大而變大

看代碼睬涧,可以知道,工作原理其實就是在頁面組件上有包了一成高級組件來代替原來的頁面組件

到這里旗唁,代碼分割其實已經(jīng)解決了畦浓,但是如果項目有100個頁面,那laodable.js就需要寫100遍检疫,這樣就感覺有點冗余了讶请,所以這個我們可以封裝一下

首先,我們建一個util

src/util/loadable.js

import React from 'react';
import Loadable from 'react-loadable';

//通用的過場組件
const loadingComponent =()=>{
    return (
        <div>loading</div>
    ) 
}

//過場組件默認采用通用的屎媳,若傳入了loading夺溢,則采用傳入的過場組件
export default (loader,loading = loadingComponent)=>{
    return Loadable({
        loader,
        loading
    });
}

不難看出,我們可以將按需加載的組件和過渡組件通過參數(shù)傳入最后返回包裝后的組件烛谊,如此一來风响,home下面的laodable.js就不需要再建了

router里面調(diào)用方式改為如下

import React, { Fragment } from 'react'
import { BrowserRouter, Route } from 'react-router-dom'
import loadable from '../util/loadable'

const Home = loadable(()=>import('@pages/home'))

const Routes = () => (
    <BrowserRouter>
        <Route path="/home" component={Home}/>
    </BrowserRouter>
);

export default Routes

封裝之后,laodable只需寫一次丹禀,改變的只是組件的引入方式状勤,這樣一來就方便多了鞋怀,react-loadable是以組件級別來分割代碼的,這意味著荧降,我們不僅可以根據(jù)路由按需加載接箫,還可以根據(jù)組件按需加載,使用方式和路由分割一樣朵诫,只用修改組件的引入方式即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辛友,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剪返,更是在濱河造成了極大的恐慌废累,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱盲,死亡現(xiàn)場離奇詭異邑滨,居然都是意外死亡,警方通過查閱死者的電腦和手機钱反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門掖看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人面哥,你說我怎么就攤上這事哎壳。” “怎么了尚卫?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵归榕,是天一觀的道長。 經(jīng)常有香客問我吱涉,道長刹泄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任怎爵,我火速辦了婚禮特石,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳖链。我一直安慰自己姆蘸,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布撒轮。 她就那樣靜靜地躺著乞旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪题山。 梳的紋絲不亂的頭發(fā)上兰粉,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音顶瞳,去河邊找鬼玖姑。 笑死愕秫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的焰络。 我是一名探鬼主播戴甩,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闪彼!你這毒婦竟也來了甜孤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤畏腕,失蹤者是張志新(化名)和其女友劉穎缴川,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體描馅,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡把夸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铭污。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋日。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘹狞,靈堂內(nèi)的尸體忽然破棺而出岂膳,到底是詐尸還是另有隱情,我是刑警寧澤刁绒,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布闷营,位于F島的核電站烤黍,受9級特大地震影響知市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜速蕊,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一嫂丙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧规哲,春花似錦跟啤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袄简,卻和暖如春腥放,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绿语。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工秃症, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留候址,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓种柑,卻偏偏與公主長得像岗仑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子聚请,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容