寫在前面
Md2site是基於Omi的一款Markdown轉網站工具,使用簡單,生成的檔案輕巧,功能強大。
- 官網:http://alloyteam.github.io/omi/md2site/
- Github: https://github.com/AlloyTeam/omi/tree/master/md2site
- 真實案例:http://alloyteam.github.io/omi/website/docs-cn.html
在使用之前的版本的時候,你會發現體驗非常好?為什麼非常好?因為頁面間的切換是無重新整理!
無重新整理的原理就是,所有的markdown都會被webpack打包到js裡,只要在js動態require就行。
這樣帶來的一個問題便是:如果有海量的markdown的時候,首次載入的時間非常長。
怎麼解決?支援動態拉取和解析markdown~~
使用姿勢
$ npm install md2site -g
$ md2site init your_project_name
$ cd your_project_name
$ npm run dev
$ npm run dist
所有命令都是和以前一樣的。接下來,開啟project.js:
module.exports = {
cdn : '',
async: true
}
- 你把async改成true就代表會生成一個非同步拉取和解析markdown的網站
- 你把async改成false就代表會生成一個完全無重新整理的網站
夠方便吧!!一鍵配置!!
原理解析
防止webpack打包markdown
當我們設定async為true的時候,不是希望webpack把markdown打包入js裡的,所以在webpack config做了如下操作:
var proj_config = require('./project.js');
if(proj_config.async) {
config.module.loaders[3].exclude = /\.md$/;
}
其中config.module.loaders[3]就是配置的markdown loader。exclude就代表把相關的正則匹配到的檔案直接給無視掉。
動態載入markdown
loadMarkdown(url,callback) {
var xobj = new XMLHttpRequest();
xobj.open('GET', url, true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
callback(xobj.responseText);
}
};
xobj.send(null);
}
載入完後直接交給remarkable解析成HTML,remarkable解析成HTML的速度超快到你無法感知,所以提前生成好HTML不是非常必要。
Async Update
asyncUpdate() {
this.loadMarkdown("../../docs/" + this.data.lan + "/" + this.data.name + ".md",(md)=>{
this.data.html = this.md.render(md);
this.update();
})
}
非同步的重新整理元件。
詳細的程式碼可以看這裡
Github
歡迎使用~~