如何写一个自己的hexo主题

好长时间不写东西了,都在忙工作,去年三月份的时候我搞了一个hexo的博客,主题换过两三个吧,感觉都大部分的hexo主题都是东西比较多,有那么两三个比较简单的,但是自己并不是很喜欢,所以去年的时候就想着自己抽时间写一个自己的主题,但是当初看了几个hexo主题的源码,完全看不懂是什么,所以放弃了,今年又定了一个目标,写一个自己的hexo主题,终于终于在文章写一个自己的Hexo主题和该文中提到的作者自己写的主题hexo-showonne的启发下,开始了自己的hexo主题之旅,之后更参考自己用了很长时间的hexo主题——hexo-theme-icarus进行了修正。

我的博客就是用的我写的主题,博客地址:https://mrzhang123.github.io/

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

搭建项目

参考大多数的hexo主题的目录结构不难发现,大部分都会有layout、source以及配置文件_config.yml,所以具体目录如下:

├── _config.yml      #主题的配置文件
├── layout          #布局模版文件夹 
│   ├── comment     #评论相关模版
│   ├── common      #公共的模版
│   │   └── post    #post页相关模版
│   └── plugin      #插件
├── source          #主题的css和js
│   └── css
│       └── images  #主题中用到的图片
└── source_src      #scss所在的文件夹
    └── scss
        ├── code-style
        └── markdown-style

项目基于gulp搭建,hexo默认使用stylus,但是我使用的scss,然后生成css,但是在项目过程中发现一个问题(同时明白为什么hexo默认使用stylus,可以直接识别styl文件),hexo提供了hexo-config方法,可以读取_config.yml中的配置。所以如果想要在_config.yml中动态设置代码的高亮主题,可以在stylus中写如下代码:

/*
一个三元表达式设置默认主题
然后在index.styl中设置引入的表达式
*/
highlight = hexo-config("customize.highlight") || "tomorrow"

@import "highlight/" + highlight

但是我在项目中使用的是gulp-sass编译成的css文件,无法实现根据_config.yml动态的引入文件,所以准备下次改的时候直接换stylus(虽然hexo可以通过装插件识别scss,但是自己测试并未成功)。

布局

布局文件layout.ejs

在layout文件夹下,布局被写在layout.ejs中,由于hexo支持模块儿化布局,使用hexo提供的局部函数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默认使用ejs语法,但是可以通过安装插件使用Haml和Jade(Jade以前看过,并不喜欢缩进的写法,所以在开发工程中也没用使用同样使用缩进语法的stylus)。

项目中直接使用了ejs,所以这里简要列一下ejs中tag的使用:

  • <%' 脚本标签,用于控制流程,不会输出
  • <%= 将转义的值输出到模版
  • <%- 将未转义的值输出到模版
  • <%# 注释标签
  • <%% 输出 '<%'
  • %> 闭合标签
  • -%> Trim-mode ('newline slurp') 标签, 移除随后的换行符

其他模版

Url Description Layout
/ 首页 index.ejs
/yyyy/mm/dd/:title/ 文章 post.ejs
/archives/ 归档 archive.ejs
/tags/:tagname/ 某个标签的归档 tag.ejs
/:else/ 其他 page.ejs

在我的主题中只有主页index.ejs,文章页post.ejs。

变量

模版中获取文章,调用配置项等会使用到变量,hexo提供了很多变量供我们使用(hexo提供的变量),其中比较重要的有:

  • page:针对该页面的内容以及 front-matter 所设定的变量
  • config:网站配置(hexo的_config.yml)
  • theme:主题配置(theme的_config.yml)
  • url:当前页面的完整网址
  • path:当前页面的路径(不含根路径)

另外在参看主题hexo-theme-icarus的源码发现一些变量的使用,但是我在官方文档中并没有找到。

  • post.title:文章的题目
  • post.excerpt:文章的摘要,即写文章的时候``之上的那段儿,首页显示
  • post.comments:评论模块
  • post.photots:文章中插入的图片
  • post.content:文章内容
  • post.date:文章的时间

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

辅助函数

在hexo中同样提供了很多辅助函数方便在博客主题中使用,但是同样很多都用不着,常用的有:

  • url_for:输出路径
  • partial:载入其他模版文件
  • css:载入css文件
  • js:载入js文件
  • data_xml:插入 XML 格式的日期
  • paginator:生成分页,其中可以插入配置,partial一样,例如改变上一页下一页的文字,可以配置{ prev_text: '« 上一页', next_text: '下一页 »'}

关于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中添加相应的script标签插入代码即可,以前的时候用多说,现在多说要关闭了,准备换个,但是找来找去没找到一个比较适合的,同事介绍有一个叫来必力的还不错,试用确实觉得可以,可以替代多说,所以推荐一下。官方网站

代码高亮

代码高亮其实就是引入一段css的代码,为了实现可以通过配置文件动态引入,就需要配合hexo-config,前面已经提到过,这里不再重复。

最后

最后写一点自己的想法,说实话,hexo的官方文档,实在是烂的没话可说,跟webpack1的文档不相上下,估计连作者自己都不一定看得懂,所以要想自己写一个主题的同学们还是在github参考一下写的比较好的主题的源码吧。

另外,当前这个版本功能相对简单一点儿而且在后期的修改过程中发现用scss确实不如直接用stylus方便一些,所以准备在以后改用stylus。

参考

hexo-theme-icarus
写一个自己的Hexo主题
hexo-showonne

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容