React利用lazy+Suspense實(shí)現(xiàn)路由懶加載
文檔
進(jìn)入頁(yè)面后,組件的內(nèi)容會(huì)通過 http 請(qǐng)求到對(duì)應(yīng)的組件文件,當(dāng)路由中有較多的頁(yè)面時(shí),會(huì)出現(xiàn)一個(gè)問題,那就是一次性將所有的組件都加載了,浪費(fèi)性能,所以可以通過懶加載的形式來處理。
src/router/routes.ts,使用 react 的 lazy 進(jìn)行按需引入:
import { lazy, LazyExoticComponent } from 'react' export interface RouteType { path: string component: LazyExoticComponent<any> title?: string exact?: boolean } const routes: RouteType[] = [ { path: '/', component: lazy(() => import('@/views/home/HomePage')) }, { path: '/demo/index', component: lazy(() => import('@/views/demo/DemoIndex')) }, { path: '/demo/popup', component: lazy(() => import('@/views/demo/DemoPopup')) } ] export default routes
react 的 lazy 按需引入必須搭配 Suspense 才能實(shí)現(xiàn)懶加載過程,在 src/router/components/AppRouter.tsx 中引入創(chuàng)建的路由表:
import React, { Suspense } from 'react' import { Router, Route, Switch } from 'react-router-dom' import { createBrowserHistory, History } from 'history' import RouteLoading from './RouteLoading' import routes, { RouteType } from '../routes' import { BASE_PATH } from '@/globalConstants' const history: History = createBrowserHistory() const AppRouter = () => { const AppRoutes = routes.map((route: RouteType) => <Route exact={route.exact === false ? false : true} path={`${BASE_PATH}${route.path}`} render={(props: any) => <route.component {...props} />} key={route.path} /> ) return ( <Router history={history}> <Suspense fallback={<RouteLoading />}> <Switch>{AppRoutes}</Switch> </Suspense> </Router> ) } export default AppRouter
src/router/components/RouteLoading.js :
import React from 'react' import { UuiLoading } from 'uui-web-react' export default function() { return <UuiLoading /> }
Suspense 的 fallback 屬性可以是一個(gè)組件,該組件的引入不需要使用 lazy(),直接引入即可。
src/router/index.tsx :
export { default as AppRouter } from './components/AppRouter' export { default as routes } from './routes'
其中,引用到了 globalConstants.ts 中定義的路由常量 BASE_PATH ,src/globalConstants.ts:
// 獨(dú)立運(yùn)行的路由要與配置文件保持一致 export const PUBLIC_PATH = '/uui-utils' export const BASE_PATH = PUBLIC_PATH
App.tsx :
import React from 'react' import { AppRouter } from './router' const App = () => { return <AppRouter /> } export default App
總結(jié):
Lazy 和 Suspense 都是 react 暴露的 api,在使用時(shí)需要注意:
Lazy 是個(gè)高階函數(shù),接收一個(gè)函數(shù)形參,最終返回一個(gè)組件, 形參中函數(shù)固定格式:
() => { return import('../../pages/Home/index')};
可以簡(jiǎn)寫為:
const Home = lazy(() => import('../../pages/Home/index'))
使用 lazy 進(jìn)行路由懶加載后,每次點(diǎn)擊 Link 后,再去請(qǐng)求相關(guān)的組件,那這個(gè)請(qǐng)求是會(huì)耗時(shí)間的。在網(wǎng)速比較慢的情況下,會(huì)出現(xiàn)路由視圖白屏的情況,所以使用 Suspense 標(biāo)簽包裹注冊(cè)的路由來進(jìn)行白屏?xí)r的頁(yè)面展示。
Suspense 標(biāo)簽接收一個(gè)屬性 fallback,fallback 指定一個(gè)組件或者 jsx 代碼塊,來展示當(dāng)請(qǐng)求對(duì)應(yīng)組件,界面白屏?xí)r所展示的內(nèi)容。
到此這篇關(guān)于React利用lazy+Suspense實(shí)現(xiàn)路由懶加載的文章就介紹到這了,更多相關(guān)React路由懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React 組件的狀態(tài)下移和內(nèi)容提升的操作方法
這篇文章主要介紹了React 組件的狀態(tài)下移和內(nèi)容提升,通過代碼講解了渲染性能的組件問題結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-11-11React中Provider組件詳解(使用場(chǎng)景)
這篇文章主要介紹了React中Provider組件使用場(chǎng)景,使用Provider可以解決數(shù)據(jù)層層傳遞和每個(gè)組件都要傳props的問題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-02-02詳解如何用webpack4從零開始構(gòu)建react開發(fā)環(huán)境
這篇文章主要介紹了詳解如何用webpack4從零開始構(gòu)建react開發(fā)環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01在React中實(shí)現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案
在現(xiàn)代Web開發(fā)中,處理和展示大量數(shù)據(jù)是一個(gè)常見的挑戰(zhàn),特別是在使用React框架時(shí),我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導(dǎo)出功能,本文將介紹如何在React中實(shí)現(xiàn)一個(gè)高效、分塊導(dǎo)出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下2024-12-12React生命周期與父子組件間通信知識(shí)點(diǎn)詳細(xì)講解
生命周期函數(shù)指在某一時(shí)刻組件會(huì)自動(dòng)調(diào)用并執(zhí)行的函數(shù)。React每個(gè)類組件都包含生命周期方法,以便于在運(yùn)行過程中特定的階段執(zhí)行這些方法2022-11-11淺談React Native 傳參的幾種方式(小結(jié))
這篇文章主要介紹了淺談React Native 傳參的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05