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)前我的依賴包版本 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
依賴 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則不支持,也就是說當(dāng)懶加載的路由內(nèi)容很大時(shí),route.lazy的方式很有可能有一段時(shí)間的白屏。
除了fallback
,目前我的體驗(yàn)上還沒發(fā)現(xiàn)其他的區(qū)別,如果還有其他的區(qū)別可以評(píng)論區(qū)討論一下奧
所以對(duì)比來看的話,route.lazy好像沒有什么優(yōu)勢(shì)
那么我就有疑問了,我覺得fallback
這個(gè)屬于比較基礎(chǔ)的功能,react-router既然加入的route.lazy的用法,為什么不加 fallback 呢
4. React Router 為什么不自帶fallback功能,要怎么處理?
我找到了一個(gè)react-router的issues,問了相同的問題,react-router的作者之一進(jìn)行了回答,1是印證了react-router確實(shí)沒有自帶fallback的功能,2是回答了作者是如何考慮,以及如果想增加fallback的效果要怎么處理
issues: github.com/remix-run/react-router/discussions/10540
作者認(rèn)為:
簡(jiǎn)單說...這好像就是作者喜好的問題?
React Router 官網(wǎng)的效果是,跳轉(zhuǎn)路由過程中(懶加載過程),當(dāng)前頁面淡出、頂部增加進(jìn)度條的方式,而非fallback
的loading方式
4.1 useNavigation
如果使用route.lazy的方式,可以使用這個(gè) useNavigation 這個(gè)hooks,來判斷路由是否是loading
的狀態(tài)
經(jīng)過測(cè)試,頁面跳轉(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修改數(shù)組對(duì)象的注意事項(xiàng)及說明
這篇文章主要介紹了React修改數(shù)組對(duì)象的注意事項(xiàng)及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12詳解react、redux、react-redux之間的關(guān)系
這篇文章主要介紹了詳解react、redux、react-redux之間的關(guān)系,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04react開發(fā)中如何使用require.ensure加載es6風(fēng)格的組件
本篇文章主要介紹了react開發(fā)中如何使用require.ensure加載es6風(fēng)格的組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05關(guān)于react的代理配置(可配置多個(gè)代理)
這篇文章主要介紹了關(guān)于react的代理配置(可配置多個(gè)代理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12React啟動(dòng)時(shí)webpack版本沖突報(bào)錯(cuò)的解決辦法
在啟動(dòng)React應(yīng)用時(shí),遇到Webpack版本不匹配導(dǎo)致的運(yùn)行錯(cuò)誤,解決方法包括刪除全局及局部的webpack和webpack-cli,然后根據(jù)項(xiàng)目需求安裝特定版本的webpack,本文通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09