博客二

前言

hexo_logo.png

現(xiàn)在我們的blog是基于Hexo生成了诀紊,同時(shí)我下載了現(xiàn)在最為流行的主題nextyilia

當(dāng)然Hexo的主題不僅僅是這兩個(gè)芝雪,之所以看它們是因?yàn)槭褂盟鼈兊娜藬?shù)最多,而且主題也在持續(xù)更新中,功能也非常齊全,如果不是特別愛折騰直接挑選他們就ok了捕虽,

但是,恰恰我喜歡折騰坡脐,用著別人開發(fā)好的主題薯鳍,總是覺得少了那么一點(diǎn)意思,雖然我現(xiàn)在寫不出Hexo這樣的靜態(tài)頁面生成框架挨措,但是主題就是頁面顯示總得自己弄一個(gè)了吧。而且用他們的主題感覺很多東西都不能讓我更好的表達(dá)我自己崩溪。

思考

想制作一個(gè)主題浅役,基本知識(shí)就應(yīng)該具備咯,HTML,CSS,JavaScript伶唯,這些是最基本觉既,不然一個(gè)基本頁面都做不出來,然后高級(jí)一些就是使用框架乳幸,使用一些庫(kù)瞪讼。只要基礎(chǔ)扎實(shí)些,剩下的可以慢慢磨粹断,一邊做一邊學(xué)習(xí)符欠。

現(xiàn)在我們來分析一下Hexo的具體工作機(jī)制。

image.png

hexo可以粗略分為三個(gè)子項(xiàng)目瓶埋,分別是:

  • hexo-cli

  • hexo (下文中用hexo core來指代)

  • hexo plugins

其中hexo plugins不是指某一個(gè)單獨(dú)的項(xiàng)目希柿,而是泛指所有的hexo plugin項(xiàng)目。
請(qǐng)看下圖:

image.png

讓我們結(jié)合這張圖來大致看看這三個(gè)項(xiàng)目的作用(下面的鏈接均是指向Github中相關(guān)的源碼):

  • hexo-cli: hexo命令行項(xiàng)目养筒,作用是:
    1. 啟動(dòng)hexo命令(進(jìn)程)曾撤,及其參數(shù)解析機(jī)制。每次我們輸入’hexo xxx’命令后晕粪,都會(huì)通過node調(diào)用hexo-cli中的entry函數(shù)(比如挤悉,可以把’hexo init’視為’node hexo-cli/entry.js init’)
    2. 實(shí)現(xiàn)hexo命令的三個(gè)初始參數(shù)(功能): init / version / help
    3. 加載hexo核心模塊,并初始化
  • hexo core: hexo核心巫湘,他的主要作用如下:
    1. 實(shí)現(xiàn)了hexo功能擴(kuò)展對(duì)象
    2. 實(shí)現(xiàn)了hexo核心功能, 如new, publish, generate等(其實(shí)是一些hexo插件装悲,下文中會(huì)詳細(xì)分析)
  • hexo plugins: 指一些能夠擴(kuò)展hexo的插件。插件可以按功能分成兩類:
    1. 擴(kuò)展hexo命令的參數(shù)尚氛,如hexo-server(安裝這個(gè)插件以后才能使用hexo server命令)
    2. 擴(kuò)展hexo解析文件的”能力”衅斩,如增加jade模版解析功能的hexo-render-jade插件

從markdown到html的旅程

簡(jiǎn)單來說,hexo中怠褐,從markdown到html的generate過程中做了兩件事:

模板渲染
模板渲染
是的畏梆,就是這樣,就是兩次模板渲染。只不過兩次渲染的輸入奠涌、渲染模板的引擎宪巨、輸出不一樣。此處應(yīng)該有一個(gè)表格:

image.png

還得有一張圖:

image.png

對(duì)上面表格和圖的說明:

  • hexo core在generate的過程中會(huì)產(chǎn)生一個(gè)對(duì)象溜畅,我們?cè)谶@里把這個(gè)對(duì)象稱為article捏卓。第一次渲染的主要目的就是給這個(gè)對(duì)象添加title,content等屬性。其中:
    1.article.title, article.date, article.tags, article.categories等屬性來自yml front的部分
    2.article.content是markdown文章解析后的html片段

  • hexo項(xiàng)目目錄下包含三個(gè)子目錄慈格,
    source目錄怠晴,寫博客的主要工作目錄。這個(gè)目錄下存放的是我們的markdown文章以及js, images, css
    themes目錄浴捆,主題目錄蒜田,定義了即將生成的html的layout, 和html中需要加載的css, js, images
    public目錄, hexo generate的最終輸出目錄。里面包含了整個(gè)博客網(wǎng)站的html, css, js, images

  • 第二次渲染选泻,需要引入對(duì)應(yīng)模板文件格式的插件冲粤,如.ejs文件就需要使用hexo-render-ejs插件,.jade文件需要使用hexo-render-jade插件页眯,而.sass文件則需要hexo-render-sass插件來轉(zhuǎn)換成css文件梯捕。hexo的這一設(shè)計(jì)有點(diǎn)類似webpack中的loader。

hexo插件是如何工作的

hexo和webpack還有一點(diǎn)類似的地方就是插件驅(qū)動(dòng)理念窝撵。即hexo(和webpack)是先實(shí)現(xiàn)一套(插件)擴(kuò)展系統(tǒng)傀顾,然后再往擴(kuò)展系統(tǒng)中添加插件來實(shí)現(xiàn)自身的功能。即我們?nèi)粘J褂玫膆exo init, hexo new碌奉,hexo generate等等功能都是通過一個(gè)個(gè)插件(其實(shí)就是一個(gè)個(gè)function)實(shí)現(xiàn)的锣笨。

具體來講就是:

  1. hexo.extend這個(gè)對(duì)象的每個(gè)屬性都是一個(gè)用來綁定(特定)插件的對(duì)象。(所謂”綁定”道批,其實(shí)就是對(duì)象的register方法)
  2. hexo初始化過程中先加載內(nèi)部插件错英,再加載外部插件

而這些插件的功能分為兩大類: 命令行插件和generate過程相關(guān)功能,例如:

  • 命令行插件, hexo

    new, 是在hexo.extend.console對(duì)象上綁定的一個(gè)插件

  • generate過程相關(guān)的插件隆豹,如上文提到的往article對(duì)象添加title,content等屬性的功能椭岩,是通過往hexo.extend.processer對(duì)象上綁定post插件來實(shí)現(xiàn)

所以,當(dāng)我們想自己動(dòng)手寫插件時(shí)璃赡,就是像hexo官網(wǎng)給出的這樣,調(diào)用某個(gè)對(duì)象的register方法判哥,如hexo.extend.console.register。

image.png

如上圖碉考,(用戶通過瀏覽器訪問到的)git page上的博客網(wǎng)站其實(shí)是hexo generate之后生成的public目錄下的內(nèi)容塌计。

所以,一個(gè)hexo博客項(xiàng)目應(yīng)該有兩個(gè)倉(cāng)庫(kù):

    1. (基于hexo init結(jié)果的)博客編寫倉(cāng)庫(kù)侯谁⌒拷觯可以把這個(gè)項(xiàng)目看成一個(gè)代碼庫(kù)章钾,用來”開發(fā)”博客網(wǎng)站(包含寫博客,生成博客等任務(wù))
    1. 存放(hexo generate結(jié)果的)public目錄倉(cāng)庫(kù)热芹。這個(gè)項(xiàng)目是”只讀”的贱傀,我們不會(huì)直接修改這個(gè)倉(cāng)庫(kù)的內(nèi)容,我們也不會(huì)對(duì)這個(gè)倉(cāng)庫(kù)直接進(jìn)行g(shù)it pull伊脓、git commit府寒、git push等常規(guī)操作。這個(gè)倉(cāng)庫(kù)的內(nèi)容就是public目下的內(nèi)容报腔,即是通過hexo generate產(chǎn)生株搔、hexo deploy提交的。

先介紹一下Hexo的工作原理纯蛾,待續(xù)纤房。。茅撞。。巨朦。米丘。。糊啡。拄查。。棚蓄。堕扶。。梭依。稍算。。役拴。糊探。。河闰。科平。。姜性。瞪慧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市部念,隨后出現(xiàn)的幾起案子弃酌,更是在濱河造成了極大的恐慌氨菇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢腻,死亡現(xiàn)場(chǎng)離奇詭異门驾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)多柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奶是,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竣灌,你說我怎么就攤上這事聂沙。” “怎么了初嘹?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵及汉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我屯烦,道長(zhǎng)坷随,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任驻龟,我火速辦了婚禮温眉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翁狐。我一直安慰自己类溢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布露懒。 她就那樣靜靜地躺著闯冷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懈词。 梳的紋絲不亂的頭發(fā)上蛇耀,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音坎弯,去河邊找鬼蒂窒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荞怒,可吹牛的內(nèi)容都是我干的洒琢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼褐桌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衰抑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荧嵌,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤呛踊,失蹤者是張志新(化名)和其女友劉穎砾淌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭网,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汪厨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愉择。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫乱。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锥涕,靈堂內(nèi)的尸體忽然破棺而出衷戈,到底是詐尸還是另有隱情,我是刑警寧澤层坠,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布殖妇,位于F島的核電站,受9級(jí)特大地震影響破花,放射性物質(zhì)發(fā)生泄漏谦趣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一座每、第九天 我趴在偏房一處隱蔽的房頂上張望前鹅。 院中可真熱鬧,春花似錦尺栖、人聲如沸嫡纠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉橱,卻和暖如春挫以,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窃祝。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工掐松, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粪小。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓大磺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親探膊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杠愧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容