如何寫一個自己的hexo主題

好長時間不寫東西了批狐,都在忙工作滨彻,去年三月份的時候我搞了一個hexo的博客,主題換過兩三個吧本刽,感覺都大部分的hexo主題都是東西比較多鲸湃,有那么兩三個比較簡單的,但是自己并不是很喜歡子寓,所以去年的時候就想著自己抽時間寫一個自己的主題暗挑,但是當(dāng)初看了幾個hexo主題的源碼,完全看不懂是什么斜友,所以放棄了炸裆,今年又定了一個目標(biāo),寫一個自己的hexo主題鲜屏,終于終于在文章寫一個自己的Hexo主題和該文中提到的作者自己寫的主題hexo-showonne的啟發(fā)下烹看,開始了自己的hexo主題之旅,之后更參考自己用了很長時間的hexo主題——hexo-theme-icarus進(jìn)行了修正洛史。

我的博客就是用的我寫的主題惯殊,博客地址:https://mrzhang123.github.io/

項目地址:https://github.com/MrZhang123/hexo-theme-SpecLumn

搭建項目

參考大多數(shù)的hexo主題的目錄結(jié)構(gòu)不難發(fā)現(xiàn),大部分都會有l(wèi)ayout也殖、source以及配置文件_config.yml土思,所以具體目錄如下:

├── _config.yml      #主題的配置文件
├── layout          #布局模版文件夾 
│   ├── comment     #評論相關(guān)模版
│   ├── common      #公共的模版
│   │   └── post    #post頁相關(guān)模版
│   └── plugin      #插件
├── source          #主題的css和js
│   └── css
│       └── images  #主題中用到的圖片
└── source_src      #scss所在的文件夾
    └── scss
        ├── code-style
        └── markdown-style

項目基于gulp搭建,hexo默認(rèn)使用stylus忆嗜,但是我使用的scss己儒,然后生成css,但是在項目過程中發(fā)現(xiàn)一個問題(同時明白為什么hexo默認(rèn)使用stylus,可以直接識別styl文件)捆毫,hexo提供了hexo-config方法闪湾,可以讀取_config.yml中的配置。所以如果想要在_config.yml中動態(tài)設(shè)置代碼的高亮主題绩卤,可以在stylus中寫如下代碼:

/*
一個三元表達(dá)式設(shè)置默認(rèn)主題
然后在index.styl中設(shè)置引入的表達(dá)式
*/
highlight = hexo-config("customize.highlight") || "tomorrow"

@import "highlight/" + highlight

但是我在項目中使用的是gulp-sass編譯成的css文件响谓,無法實現(xiàn)根據(jù)_config.yml動態(tài)的引入文件损合,所以準(zhǔn)備下次改的時候直接換stylus(雖然hexo可以通過裝插件識別scss,但是自己測試并未成功)娘纷。

布局

布局文件layout.ejs

在layout文件夾下嫁审,布局被寫在layout.ejs中,由于hexo支持模塊兒化布局赖晶,使用hexo提供的局部函數(shù)partial載入其他模版文件律适,配合ejs的語法,布局文件layout.ejs:

<%- partial('common/head') %>
<div class="content">
    <%- partial('common/header') %>
    <div class="main">
        <%- body %>
    </div>
</div>
<%- partial('common/footer') %>
<%- partial('common/foot') %>
</body>
</html>

hexo默認(rèn)使用ejs語法遏插,但是可以通過安裝插件使用Haml和Jade(Jade以前看過捂贿,并不喜歡縮進(jìn)的寫法,所以在開發(fā)工程中也沒用使用同樣使用縮進(jìn)語法的stylus)胳嘲。

項目中直接使用了ejs厂僧,所以這里簡要列一下ejs中tag的使用:

  • <%' 腳本標(biāo)簽,用于控制流程了牛,不會輸出
  • <%= 將轉(zhuǎn)義的值輸出到模版
  • <%- 將未轉(zhuǎn)義的值輸出到模版
  • <%# 注釋標(biāo)簽
  • <%% 輸出 '<%'
  • %> 閉合標(biāo)簽
  • -%> Trim-mode ('newline slurp') 標(biāo)簽, 移除隨后的換行符

其他模版

Url Description Layout
/ 首頁 index.ejs
/yyyy/mm/dd/:title/ 文章 post.ejs
/archives/ 歸檔 archive.ejs
/tags/:tagname/ 某個標(biāo)簽的歸檔 tag.ejs
/:else/ 其他 page.ejs

在我的主題中只有主頁index.ejs颜屠,文章頁post.ejs。

變量

模版中獲取文章鹰祸,調(diào)用配置項等會使用到變量甫窟,hexo提供了很多變量供我們使用(hexo提供的變量),其中比較重要的有:

  • page:針對該頁面的內(nèi)容以及 front-matter 所設(shè)定的變量
  • config:網(wǎng)站配置(hexo的_config.yml)
  • theme:主題配置(theme的_config.yml)
  • url:當(dāng)前頁面的完整網(wǎng)址
  • path:當(dāng)前頁面的路徑(不含根路徑)

另外在參看主題hexo-theme-icarus的源碼發(fā)現(xiàn)一些變量的使用蛙婴,但是我在官方文檔中并沒有找到粗井。

  • post.title:文章的題目
  • post.excerpt:文章的摘要,即寫文章的時候``之上的那段兒街图,首頁顯示
  • post.comments:評論模塊
  • post.photots:文章中插入的圖片
  • post.content:文章內(nèi)容
  • post.date:文章的時間

以上均獲取的是hexo生成的markdown文件中的配置浇衬。

輔助函數(shù)

在hexo中同樣提供了很多輔助函數(shù)方便在博客主題中使用,但是同樣很多都用不著餐济,常用的有:

  • url_for:輸出路徑
  • partial:載入其他模版文件
  • css:載入css文件
  • js:載入js文件
  • data_xml:插入 XML 格式的日期
  • paginator:生成分頁耘擂,其中可以插入配置,partial一樣颤介,例如改變上一頁下一頁的文字,可以配置{ prev_text: '? 上一頁', next_text: '下一頁 ?'}

關(guān)于partical需要注意幾點

  1. 它可以添變量赞赖,在被引用文件直接可以飲用滚朵,例如:
/*引用*/
<%- partial('plugin/scripts', { isHead: true }) %>
/*被引用文件判斷*/
<% if (typeof(isHead) !== 'undefined' && isHead) { %>

<% } %>
  1. 可以添加class名字
<%- partial('post/date', { class_name: 'article-date', date_format: null }) %>

其他

評論

hexo中添加評論只需要在ejs中添加相應(yīng)的script標(biāo)簽插入代碼即可,以前的時候用多說前域,現(xiàn)在多說要關(guān)閉了辕近,準(zhǔn)備換個,但是找來找去沒找到一個比較適合的匿垄,同事介紹有一個叫來必力的還不錯移宅,試用確實覺得可以归粉,可以替代多說,所以推薦一下漏峰。官方網(wǎng)站糠悼。

代碼高亮

代碼高亮其實就是引入一段css的代碼,為了實現(xiàn)可以通過配置文件動態(tài)引入浅乔,就需要配合hexo-config倔喂,前面已經(jīng)提到過,這里不再重復(fù)靖苇。

最后

最后寫一點自己的想法席噩,說實話,hexo的官方文檔贤壁,實在是爛的沒話可說悼枢,跟webpack1的文檔不相上下,估計連作者自己都不一定看得懂脾拆,所以要想自己寫一個主題的同學(xué)們還是在github參考一下寫的比較好的主題的源碼吧馒索。

另外,當(dāng)前這個版本功能相對簡單一點兒而且在后期的修改過程中發(fā)現(xiàn)用scss確實不如直接用stylus方便一些假丧,所以準(zhǔn)備在以后改用stylus双揪。

參考

hexo-theme-icarus
寫一個自己的Hexo主題
hexo-showonne

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市包帚,隨后出現(xiàn)的幾起案子渔期,更是在濱河造成了極大的恐慌,老刑警劉巖渴邦,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疯趟,死亡現(xiàn)場離奇詭異,居然都是意外死亡谋梭,警方通過查閱死者的電腦和手機信峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓮床,“玉大人盹舞,你說我怎么就攤上這事“” “怎么了踢步?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丑掺。 經(jīng)常有香客問我获印,道長,這世上最難降的妖魔是什么街州? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任兼丰,我火速辦了婚禮玻孟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳍征。我一直安慰自己黍翎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布蟆技。 她就那樣靜靜地躺著玩敏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪质礼。 梳的紋絲不亂的頭發(fā)上旺聚,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音眶蕉,去河邊找鬼砰粹。 笑死,一個胖子當(dāng)著我的面吹牛造挽,可吹牛的內(nèi)容都是我干的碱璃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼饭入,長吁一口氣:“原來是場噩夢啊……” “哼嵌器!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谐丢,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爽航,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乾忱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讥珍,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年窄瘟,在試婚紗的時候發(fā)現(xiàn)自己被綠了衷佃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹄葱,死狀恐怖氏义,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情图云,我是刑警寧澤惯悠,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站琼稻,受9級特大地震影響吮螺,放射性物質(zhì)發(fā)生泄漏饶囚。R本人自食惡果不足惜帕翻,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一鸠补、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘀掸,春花似錦紫岩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揩晴,卻和暖如春勋陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硫兰。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工诅愚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫映。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓违孝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泳赋。 傳聞我的和親對象是個殘疾皇子雌桑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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