React?Router?v6路由懶加載的2種方式小結(jié)
介紹
React Router v6 的路由懶加載有2種實(shí)現(xiàn)方式,1是使用react-router自帶的 route.lazy,2是使用React自帶的 React.lazy
下面介紹這兩種實(shí)現(xiàn)方式
注:本文內(nèi)容針對(duì)配置式路由,非約定式路由
0. 相同代碼的部分
當(dāng)前我的依賴(lài)包版本 package.json:
{
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.14.0"
},
"devDependencies": {
"@types/node": "^18.15.11",
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
"@vitejs/plugin-react": "^3.1.0",
"typescript": "^4.9.3",
"vite": "^4.2.0"
},
}
入口文件 src/App.tsx:
import './App.less'
import React from 'react'
import { RouterProvider } from 'react-router-dom'
import { router } from '@/routes'
function App() {
return <RouterProvider router={router} />
}
export default App
1. React.lazy
依賴(lài) React.lazy + React.Suspense
src/routes/index.tsx:
import React from 'react'
import { createHashRouter, Navigate, RouteObject } from 'react-router-dom'
import Loading from '@/components/Loading'
import BasicLayout from '@/layouts/BasicLayout'
import Page404 from '@/pages/common/404'
import PageLogin from '@/pages/login'
const Page_goodsMng = React.lazy(() => import('@/pages/goods/goodsMng'))
const route404 = {
path: '*',
element: <Page404 />,
}
const routes: RouteObject[] = [
{
path: '/login',
element: <PageLogin />
},
{
element: <BasicLayout />,
children: [
//// 懶加載代碼
// 商品管理
{
path: '/web/company/goods/goodsmgr',
element: (
<React.Suspense fallback={<Loading />}>
<Page_goodsMng />
</React.Suspense>
),
},
route404,
],
},
route404,
]
export default routes
export const router = createHashRouter(routes as any)
2. react-router 自帶的 route.lazy
src/routes/index.tsx:
import React from 'react'
import { createHashRouter, Navigate, RouteObject } from 'react-router-dom'
import Loading from '@/components/Loading'
import BasicLayout from '@/layouts/BasicLayout'
import Page404 from '@/pages/common/404'
import PageLogin from '@/pages/login'
const routes: RouteObject[] = [
{
path: '/login',
element: <PageLogin />
},
{
element: <BasicLayout />,
children: [
//// 懶加載代碼
// 商品管理
{
path: '/web/company/goods/goodsmgr',
// use react-router route.lazy
lazy: async () => ({
Component: (await import('@/pages/goods/goodsMng')).default,
}),
},
route404,
],
},
route404,
]
export default routes
export const router = createHashRouter(routes as any)
3. 兩種方式的區(qū)別
React.lazy的方式可以配置加載時(shí)的fallback,route.lazy則不支持,也就是說(shuō)當(dāng)懶加載的路由內(nèi)容很大時(shí),route.lazy的方式很有可能有一段時(shí)間的白屏。
除了fallback,目前我的體驗(yàn)上還沒(méi)發(fā)現(xiàn)其他的區(qū)別,如果還有其他的區(qū)別可以評(píng)論區(qū)討論一下奧
所以對(duì)比來(lái)看的話(huà),route.lazy好像沒(méi)有什么優(yōu)勢(shì)
那么我就有疑問(wèn)了,我覺(jué)得fallback這個(gè)屬于比較基礎(chǔ)的功能,react-router既然加入的route.lazy的用法,為什么不加 fallback 呢
4. React Router 為什么不自帶fallback功能,要怎么處理?
我找到了一個(gè)react-router的issues,問(wèn)了相同的問(wèn)題,react-router的作者之一進(jìn)行了回答,1是印證了react-router確實(shí)沒(méi)有自帶fallback的功能,2是回答了作者是如何考慮,以及如果想增加fallback的效果要怎么處理
issues: github.com/remix-run/react-router/discussions/10540
作者認(rèn)為:

簡(jiǎn)單說(shuō)...這好像就是作者喜好的問(wèn)題?
React Router 官網(wǎng)的效果是,跳轉(zhuǎn)路由過(guò)程中(懶加載過(guò)程),當(dāng)前頁(yè)面淡出、頂部增加進(jìn)度條的方式,而非fallback的loading方式
4.1 useNavigation
如果使用route.lazy的方式,可以使用這個(gè) useNavigation 這個(gè)hooks,來(lái)判斷路由是否是loading的狀態(tài)
經(jīng)過(guò)測(cè)試,頁(yè)面跳轉(zhuǎn)時(shí),navigation為loading

到此這篇關(guān)于React Router v6路由懶加載的2種方式小結(jié)的文章就介紹到這了,更多相關(guān)React路由懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react render的原理及觸發(fā)時(shí)機(jī)說(shuō)明
這篇文章主要介紹了react render的原理及觸發(fā)時(shí)機(jī)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
react 權(quán)限樹(shù)形結(jié)構(gòu)實(shí)現(xiàn)代碼
這篇文章主要介紹了react 權(quán)限樹(shù)形結(jié)構(gòu)實(shí)現(xiàn)代碼,項(xiàng)目背景react + ant design,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-05-05
react.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)
下面小編就為大家?guī)?lái)一篇react.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Ant Design與Ant Design pro入門(mén)使用教程
Ant Design 是一個(gè)服務(wù)于企業(yè)級(jí)產(chǎn)品的設(shè)計(jì)體系,組件庫(kù)是它的 React 實(shí)現(xiàn),antd 被發(fā)布為一個(gè) npm 包方便開(kāi)發(fā)者安裝并使用,這篇文章主要介紹了Ant Design與Ant Design pro入門(mén),需要的朋友可以參考下2023-12-12
解決React報(bào)錯(cuò)Parameter 'props' implicitly&nb
這篇文章主要為大家介紹了React報(bào)錯(cuò)Parameter 'props' implicitly has an 'any' type的解決處理方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

