<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前面我們已經成功將.md
檔案通過import載入到react元件中,並能拿到檔案內容進行展示。但是點選markdown
的導航連結還是會報錯:
這個報錯和前面的報錯有點相似,只是前面是無法解析連結,這裡是無法解析物件。
在react
渲染頁面時,是呼叫一個個渲染函數來渲染頁面,我們來對比一下button
頁和markdown
頁載入頁面的bundle對比一下
button頁面匯出的是一個Button
函數,返回的是建立該頁面的程式碼
markdown匯出的是一個js物件
而報錯提示我們markdown
也應該匯出為一個類或函數,否則無法識別,所以下一步,我們就需要將這個帶有markdown正文的js
物件轉換為react渲染函數。
我們前面通過自定義loader,將markdown轉為js物件匯入,那麼我們能不能將markdown物件轉為react渲染函數,直接交給react渲染呢?我們直接將loader改成返回一個react
函陣列件
// /src/loaders/markdown/loader.js function mdLoader(content) { return ` import react from 'react' const content = ${JSON.stringify(content)}; const Markdown = () => { return (<div>{content}</div>) } export default Markdown ` } module.exports = mdLoader
重啟後發現又報錯了
上面的錯誤依然很熟悉,說無法解析返回的字串,還告訴我們可能要新增其他loader來處理返回值。
umi
預設設定的babel-loader可以用來處理react元件,我們將其新增到解析鏈中,注意babel的執行順序是反的,所以要先寫babel-loader
再寫md-loader
:
api.chainWebpack(async (memo) => { const babelInUmi = memo.module.rule('src').use('babel-loader').entries(); const loaderPath = require.resolve('../loaders/markdown/loader.js'); memo.module .rule('domi-md') .test(/.md$/) .type('javascript/auto') // 用預設帶的babel-loader來處理react元件 .use('babel-loader') .loader(babelInUmi.loader) .options(babelInUmi.options) .end() .use('md-loader') .loader(loaderPath) return memo; });
完成設定後,markdown
檔案就會先經過md-loader
轉為react
元件字串,接著使用babel-loader
轉換為可執行渲染函數。
再次啟動可以看到markdown
檔案內容已經能被渲染出來
前面說了我們目前只能用js來寫loader,但是我們可以用一些小技巧,先繞過這個限制,使得不需要編譯也能使用ts來寫loader。讓webpack還是載入原來的元件,但是原來的程式碼只做個代理,實際執行程式碼可以用ts來寫:
// /src/loaders/markdown/loader.js function mdLoader(content) { const options = this.getOptions({ 'handler': true }) return options.handler.apply(this, [content])讓 } module.exports = mdLoader
// /src/loaders/markdown/index.ts export default function mdLoader(this: any, content: string) { return ` import react from 'react' const content = ${JSON.stringify(content)}; const Markdown = () => { return (<div>{content}</div>) } export default Markdown ` }
// /src/features/compile.ts import MdLoader from '../loaders/markdown/index' ... .use('md-loader') .loader(loaderPath) .options({ handler: MdLoader }) ...
完整程式碼可檢視feature/render-markdown
以上就是umi外掛開發仿dumi專案實現markdown檔案轉為頁面的詳細內容,更多關於umi markdown檔案轉頁面的資料請關注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