国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 手摸手教你擼一個(gè)靜態(tài)網(wǎng)站生成器

手摸手教你擼一個(gè)靜態(tài)網(wǎng)站生成器

時(shí)間:2023-07-26 01:36:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-07-26 01:36:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)

手摸手教你擼一個(gè)靜態(tài)網(wǎng)站生成器:

個(gè)人網(wǎng)站之前用的是Keystone.js (node.js + mongo),框架非常優(yōu)秀,但遷移起來(lái)比較麻煩,同時(shí)一直以來(lái)也感覺(jué)為了弄個(gè)博客,這個(gè)架構(gòu)顯得有點(diǎn)重,就自己擼了個(gè)靜態(tài)網(wǎng)頁(yè)生成器。想要試用的朋友可以直接點(diǎn)擊mdblog文檔,,mdblog主頁(yè)本身就由mdblog靜態(tài)網(wǎng)頁(yè)生成器實(shí)現(xiàn)的。

本文主要來(lái)回顧一下做這個(gè)靜態(tài)網(wǎng)頁(yè)生成器過(guò)程中的一些思考。

先明確一下什么是靜態(tài)網(wǎng)頁(yè)生成器?靜態(tài)網(wǎng)頁(yè)生成器的工作主要是基于一些靜態(tài)的文本來(lái)生成靜態(tài)的HTML頁(yè)面。所以可以想象一個(gè)極簡(jiǎn)的靜態(tài)網(wǎng)站生成器一般會(huì)有以下幾個(gè)步驟

  1. 讀取博文markdown文件
  2. 把markdown轉(zhuǎn)成html
  3. 生成html文件
這三個(gè)步驟做起來(lái)并不難:

  1. 用node.js 的fs讀文件api fs.readFileSync(path, 'utf-8')
  2. 用marked庫(kù)把markdown文件轉(zhuǎn)成 HTML DOM
  3. 把2中生成的HTML DOM 作為內(nèi)容插入html模板,通過(guò)fs 寫(xiě)文件api fs.writeFileSync('blog1.html', rawHtml, 'utf8');生成html文件
所以要做成這個(gè)事情,核心技術(shù)點(diǎn)上就調(diào)調(diào)API,用用庫(kù),沒(méi)有什么深刻或談得上有技術(shù)難度的東西。在設(shè)計(jì)時(shí),更多要考慮的是:在產(chǎn)品層面上,怎么做才能讓所做的東西變得好用?

首先我先明確下自己的需求,我心中滑板鞋(靜態(tài)網(wǎng)頁(yè)生成器)的是什么樣子的?

Talk is cheap , Let's see the code,整個(gè)項(xiàng)目,最核心的是一個(gè)用于構(gòu)建的node文件build.js,現(xiàn)在就以構(gòu)建文章頁(yè)的代碼為例子,看一看

// 遍歷一個(gè)文件夾下所有文件 ,生產(chǎn)的時(shí)候,不用排序function readFolder(filePath){ var files = fs.readdirSync(filePath); files.forEach(function(filename){ if(filename.indexOf('.md') === -1) return; // 無(wú)后綴文件名 let targetFileName = filename.replace('.md',''); let markdownContent = readFileAndParse(filePath + '/' + filename); writeHtml(targetFileName, markdownContent); });}// 讀取一個(gè)文件內(nèi)容function readFileAndParse(path){ text = fs.readFileSync(path, 'utf-8') try { var result = marked(text).replace(/buildAssetPath/g,'./assets'); return result; } catch (err) { console.error('解析文件出錯(cuò):'+path); }}// 文章詳情頁(yè)把內(nèi)容寫(xiě)入模板htmlfunction writeHtml(fileName,content) { let rawHtml = readFileAndParse('./src/index.html'); let headDOM = fs.readFileSync('./src/components/TopNav/nav.html', 'utf-8'); let headCSS = readCssFile('./src/components/TopNav/nav.css'); let headJS = fs.readFileSync('./src/components/TopNav/nav.js', 'utf-8'); let dryTitle = /<!--<title>(.*)<//title>-->/.exec(content); let dryIntro = /<!--<intro>(.*)<//intro>-->/.exec(content); // 讀取模板 ,把markdown內(nèi)容注入 let html = rawHtml .replace('<!-- content -->', blogTopBanner(dryTitle && dryTitle[1] ||fileName)+' <div class="markdown-body">' + content + '</div>') .replace('<!-- title -->', dryTitle && dryTitle[1] ) .replace('mdblog描述', dryIntro && dryIntro[1]) .replace('<!-- header DOM -->', headDOM) .replace('<!-- header CSS -->', '<style>' + headCSS + '</style>') .replace('<!-- header JS -->', '<script>' + headJS + '</script>') ; fs.writeFileSync('./'+ outputFold +'/' + fileName + '.html', html, 'utf8'); console.log('文章網(wǎng)頁(yè)生成成功:' + fileName + '.html');}總共三個(gè)函數(shù):一個(gè)遍歷文件,一個(gè)讀文件,一個(gè)寫(xiě)文件。其中writeHtml()函數(shù)那些花里胡哨的代碼就是把動(dòng)態(tài)把內(nèi)容(Html DOM,js,css)注入到下面的html模板里,然后產(chǎn)出html。

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="description" content="mdblog描述"> <title> <!-- title --> </title> <!-- header CSS --> <!-- homepage CSS --> <!-- postsPageCSS CSS --></head><body> <!-- header DOM --> <!-- homepage DOM --> <!-- content --> <!-- header JS --> <!-- homepage JS --> <!-- posts JS --></body></html>上面有一個(gè)feature是支持組件的本地開(kāi)發(fā)模式,三個(gè)支持可自定義的組件為如圖所示的結(jié)構(gòu)components目錄

本地開(kāi)發(fā)需要把組件的三部分(html,css,js)打包到一起,所以我這邊用了下webpack,以u(píng)iDevelop.js為入口文件,把本地組件都打包到了一起做本地?zé)岵渴鹫{(diào)試,uiDevelop.js如下

import './components/HomePage/homepage.css';import './components/TopNav/nav.css';import './components/Posts/posts.css';import homePageDom from './components/HomePage/homepage.html';import topNavDom from './components/TopNav/nav.html';import postsDom from './components/Posts/posts.html';document.write(topNavDom);document.write('<h1 ><div>FBI WARNING</div>溫馨提示:本頁(yè)把src/components 目錄下的三個(gè)組件導(dǎo)入在一個(gè)頁(yè)面,如果你也了解一些前端知識(shí),可用它來(lái)進(jìn)行頁(yè)面DRY,進(jìn)行本地調(diào)試。</h1>');document.write('<div>homePageDom 組件樣式 start</div>');document.write(homePageDom);document.write('<div>homePageDom 組件樣式 end</div>');document.write('<div>postsDom 組件樣式 start</div>');document.write(postsDom);document.write('<div>postsDom 組件樣式 start</div>');import './components/TopNav/nav.js';import './components/HomePage/homepage.js';博客列表頁(yè)博文列表信息展現(xiàn)支持自定義(包括文章配圖,標(biāo)題,介紹,標(biāo)簽,日期),在markdown頭部采用html注釋的方式標(biāo)識(shí),構(gòu)建的時(shí)候正則匹配取值

<!--<img-url>./assets/default.jpeg</img-url>--> <!--<title> mdblog 說(shuō)明文檔 </title>--> <!--<intro> 介紹mdblog </intro>--> <!--<tag>README</tag>--><!--<date>2018-08-20</date>-->所以大致比較關(guān)鍵的就以上幾點(diǎn),如果你對(duì)源碼感興趣,可以訪問(wèn)github mdblog源碼地址,歡迎各位在評(píng)論區(qū)多多交流。

最后來(lái)個(gè)小彩蛋

mdblog網(wǎng)站首頁(yè)會(huì)有個(gè)跳動(dòng)的小紅心,那是我想你的時(shí)候,摸著心用css畫(huà)的,它描述的是想你的時(shí)我心跳動(dòng)的節(jié)奏。

今天是我們相戀兩周年紀(jì)念日,小雨,我愛(ài)你!

關(guān)鍵詞:成器,靜態(tài)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉