<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前面章節中我們已經順利將tsx
元件轉換為頁面展示,但是目前提供的功能和umi
的約定式路由功能差不多,接下來我們將實現將markdown
檔案轉換為頁面展示。
我們前面所使用的頁面寫法都是react元件式寫法,umi
通過webpack
將react元件打包,這是react專案通用的模式。由於webpack
不認識markdown
檔案,所以我們直接引入markdown
檔案會報錯。所以我們只需要讓webpack
認識markdown
,通過自定義loader
來載入markdown
檔案即可。
umi
提供chainWebpack
外掛api,通過 webpack-chain 的方式修改 webpack 設定。
loader
是用於webpack
解析檔案的工具,不同的loader可以解析不同型別的檔案,使其解析的內容可被其他模組使用。
我們需要解析markdown
檔案,那麼就需要寫一個能認識markdown
檔案的loader
,它的功能就是識別.md
檔案並將檔案內容解析成物件返回給import
這個檔案的程式碼使用。
跟前面一樣,我們新建一個外掛來處理檔案解析:
// /src/features/compile.ts import type { IApi } from 'umi'; export default (api: IApi) => { api.describe({ key: 'domi:compile' }); api.chainWebpack(async (memo) => { const loaderPath = require.resolve('../loaders/markdown/loader.js'); memo.module // 通過鏈式處理,向`webpack`新增了一條名為`domi-md`的處理規則 .rule('domi-md') // 該規則用於處理`.md`檔案 .test(/.md$/) // 給這個loader取個名字 .use('md-loader') // loader的路徑 .loader(loaderPath) return memo; }); };
接下來建立loader檔案,注意這裡loader要使用js
檔案,因為webpack無法直接解析ts
型別的loader,第一個入參是檔案內容的字串形式,我們先直接返回。
// /src/loaders/markdown/loader.js function mdLoader(context) { return context } module.exports = mdLoader
為什麼`dumi`的loader是用`ts`寫的?
因為在`dumi`開發環境下,先將`ts`檔案轉成了`js`,`webpack`在執行時其實還是載入的`js`形式的loader。
dumi: 編譯 => 啟動umi(webpack) => 開發環境
domi: 啟動umi(webpack) => 開發環境
// /docs/markdown.md # 我是markdown
啟動專案可以看到markdown
檔案已經正確解析到導航欄中了
點開連結一看,啥也沒有,報錯了
看上面的報錯資訊,意思好像是懶載入的元件元素型別錯誤,開啟請求列表看看載入了什麼東西
應該就是這裡在載入markdown
檔案時,只匯出了個url連結,我們開啟連結看看
這裡就返回了markdown內容,看來目前不能直接從頁面開啟。
我們換一種方式,在jsx
中直接匯入這個檔案看看:
// /docs/index.tsx import react from 'react' import md from './markdown.md' const Home = () => { return (<div>hello domi! {md}</div>) } export default Home
重新整理頁面可以看到,import進來的物件確實只是一個地址,那我們直接放個iframe來顯示:
// /docs/index.tsx import react from 'react' import md from './markdown.md' const Home = () => { return (<> <div>hello domi!</div> <iframe src={md} /> </>) } export default Home
哈哈終於顯示出來了
當然上面並不是我們想要的效果,從前面的嘗試大概能判斷出來是webpack在打包時並沒有想我們想象那樣能直接匯出我們想要的物件。這時候我們就要使用webpack一個設定ruletype
,告訴他我們想要將markdown
檔案import成一個包含正文內容的物件,而不是一個資源地址。
這裡webpack將檔案視為Resource資源,其將所有 .md
檔案都傳送到輸出目錄,並且其路徑將被注入到 bundle中,與我們常使用的在jsx
中匯入圖片等一樣,具體可參考資源模組 | webpack 中文檔案 (docschina.org)
要改變這一預設行為,只需要設定時改變資源型別即可
// /src/features/compile.js api.chainWebpack(async (memo) => { const loaderPath = require.resolve('../loaders/markdown/loader.js'); memo.module .rule('domi-md') .test(/.md$/) // 表示檔案經過這個loader處理後轉換為可匯入的js模組 .type('javascript/auto') .use('md-loader') .loader(loaderPath) return memo; });
重啟後執行,發現又報了另一個錯誤
從報錯上看,意思大概是.md
檔案在經過loader解析後,解析返回值失敗,還告訴我們可能需要其他loader來處理返回值。
這個就比較好理解了,因為上面我們指定了經過loader處理後應該返回一個可匯出的js模組,而我們目前loader只返回了markdown
的正文內容,並不是js資料,所以我們只需要改動以下loader的返回值即可:
// /src/loaders/markdown/loader.js function mdLoader(content) { return ` const content = '${JSON.stringify(content)}' export default { content }; ` } module.exports = mdLoader
此時經過loader處理後,將會匯出一個帶有content
屬性的物件,再改變一下匯入展示的元件:
import react from 'react' import md from './markdown.md' const Home = () => { return (<div>hello domi! {md.content}</div>) } export default Home
重啟後可以看到如下所示,此時我們已經成功通過loader載入到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