<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
umi
預設約定在/src/pages
新增的(j|t)sx?
檔案會自動載入為路由。同樣我們希望實現在某個目錄下新增的markdown
檔案自動載入成為路由直接存取,本章我們首先來實現路由自動解析及頁面展示的功能。
markdown
解析目錄本節完整程式碼可參考 domi/feature/routes
我們約定在專案根目錄下/docs
目錄為markdown
自動載入目錄,先建立這個目錄
mkdir /docs
在剛建立的/docs
目錄下新增兩個元件,用於驗證解析效果
// /docs/index.tsx import react from 'react' const Home = () => { return (<div>hello domi</div>) } export default Home
// /docs/button/index.tsx import react from 'react' const Button = () => { return <button>Button</button> } export default Button
接下來建立路由解析外掛,外掛我們統一放在/src/features
目錄下
# 建立外掛目錄 mkdir /src/features # /docs目錄路由解析外掛 touch /src/features/routes.ts
接下來將外掛註冊到設定.umirc.ts
中
import { defineConfig } from "umi"; export default defineConfig({ plugins: [ './src/features/routes.ts', ], });
umi
提供了modifyRoutes
hook,通過這個勾點我們可以自由修改umi
的路由,檔案可參考外掛 API | UmiJS。
該函數入參為umi當前收集到的路由集合,返回值於入參一致,我們可以通過改變返回值來修改umi
的路由。
通過列印入參,我們可以看到初始化專案預設的路由為以下結構:
{ index: { path: '/', id: 'index', parentId: '@@/global-layout', file: 'index.tsx', absPath: '/' }, docs: { path: 'docs', id: 'docs', parentId: '@@/global-layout', file: 'docs.tsx', absPath: '/docs' }, '@@/global-layout': { id: '@@/global-layout', path: '/', file: 'D:/project/domi/src/layouts/index.tsx', parentId: undefined, absPath: '/', isLayout: true } }
這裡有幾個關鍵的屬性:
isLayout
屬性表示該物件是否為佈局,umi
的路由物件有兩種形式,一種為頁面,另一種為佈局,通過該屬性值區分。parentId
則標註該頁面使用到了哪個佈局。path
表示頁面的存取路徑file
表示該物件的元件檔案路徑,相對路徑預設會在/src/pages
中找由於我們要自己來生成markdown
專屬路由,用不到umi
預設提供的約定路由特性,所以我們不會在/src/pages
中寫頁面程式碼,這個目錄我們可以刪掉。
我們需要在modifyRoutes
勾點函數中,根據/docs
目錄下的檔案來建立對應的路由,程式碼如下所示
// /src/features/routes.ts import path from 'path'; import type { IApi } from 'umi'; import type { IRoute } from '@umijs/core/dist/types'; import { getConventionRoutes } from '@umijs/core'; export default (api: IApi) => { api.describe({ key: 'domi:routes' }); api.modifyRoutes((oRoutes: Record<string, IRoute>) => { const routes: Record<string, IRoute> = {} const docDir = 'docs' // 獲取某個目錄下所有可以設定成umi約定路由的檔案 const dirRoutes: Record<string, IRoute> = getConventionRoutes({ base: path.join(api.cwd, docDir), }); Object.entries(dirRoutes).forEach(([key, route]) => { // 這裡將檔案的路徑改為絕對路徑,否則umi會預設找/src/pages下元件 route.file = path.resolve(docDir, route.file); routes[route.id] = route; }); return routes; }); };
注意:如果用pnpm
來安裝依賴,上面程式碼的imoprt可能找不到依賴,需要在.npmrc
中新增一行node-linker=hoisted
,並從新pnpm install
,將依賴扁平化處理。
這裡用到了一個umi
內建的函數getConventionRoutes
,該函數可以將某個目錄下符合umi定義的約定路由的檔案,轉換成為路由物件
前面我們已經在/docs
下建立了兩個測試檔案,將其列印出來dirRoutes
變數為:
{ 'button/index': { path: 'button', id: 'button/index', parentId: undefined, file: 'button/index.tsx', absPath: '/button' }, index: { path: '/', id: 'index', parentId: undefined, file: 'index.tsx', absPath: '/' } }
從列印結果可以看到,getConventionRoutes
函數已經幫我們將/docs
目錄下的檔案解析出來。我們只需要處理以下檔案路徑,即可使用。
執行專案可以看到我們能正常存取到/
和/button
下的兩個頁面,到這裡我們就成功實現了路由載入。到這一步我們其實和umi
提供的約定式路由功能差不多,只不過umi
是在/src/pages
下寫頁面,我們這裡是在/docs
下寫頁面。
現在切換頁面需要我們手動輸入地址比較麻煩,下一節我們來實現一個全域性Layout佈局元件,將導航放在這個元件中。
以上就是umi外掛開發仿dumi專案實現基礎路由解析的詳細內容,更多關於umi外掛仿dumi路由解析的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45