hexo建站小结
1. 前言
更新时间 | 更新内容 |
---|---|
2020-12-01 | 初稿 |
2021-10-06 | 又换成 jekyll 了 hh |
本博客之前是使用Jekyll
搭建的, 前两天想给博客增加一个加密文章的功能, 但是搜索一番发现Jekyll
下没有比较优雅的实现方式, 而且又看了一些Jekyll
和hexo
对比的文章, 得知Jekyll
在文章比较多的时候速度会慢很多. 于是就计划将博客迁移到hexo
上.
Jekyll
和hexo
相比也是有优点的. github pages原生对Jekyll
的支持让使用Jekyll
建站变得非常简单. 使用hexo
的话就需要进行更多的配置操作.
本文中会记录配置过程中的一些操作步骤以及一些踩的坑.
2. 正文
2.1. 架构设计
上文中也说了, hexo
相比Jekyll
而言没有github pages
的原生支持, 所以配置使用都相对比较麻烦. 以一个常用的发布新博客的操作为例, 在Jekyll
中写好一个markdown文件之后直接push到github.io仓库即可. github会自己将markdown文件渲染成站点文件并发布. 而用hexo的话, 用户就需要自己在本地使用hexo generate
命令生成站点文件然后将生成的站点文件push到github.io仓库中.
对比之下hexo
有两个缺点:
- 操作更加繁琐.
- markdown源文件没有备份到github中不够安全.
不过我们可以通过使用github的私有仓库和github actions来克服这两个缺点. 整体 workflow 见下图:
┌────────────┐
│ local pc │
│ write posts│
└────┬───────┘
push to│private repo
│
┌────▼───────┐
│ priv repo │
│ run action │
└────┬───────┘
│
push to│public repo
│
┌────▼─────────┐
│ public repo. │
│ bind to │
│ github pages │
└──────────────┘
具体实现时参考了[1].
首先新建一个私有仓库blog_source
用于存储站点的各种源文件. 源文件中包含了很多token或者key啥的私密文件, 因此建议使用私有仓库来保存. 之前看到一些博客使用github.io仓库新建一个分支来保存站点源码我直呼好家伙.
然后给私有仓库配置一个Github Action. 其大致有以下两个功能
- 将源文件渲染成静态站点文件
- 将渲染的站点文件push到github.io仓库
为了实现这两个功能需要配置两个地方. 一个就是Github Action的配置文件 deploy.yml. 这个参考[1]中的模板就好了. 需要注意的是现在github的默认分支名从master
改成main
了. 所以deploy.yml中的触发条件也需要做相应的修改
on:
push:
branches:
- main
为了使得私有仓库的Action有权限往github.io仓库进行push操作. 我们需要生成一个公私钥对并分别绑定到两个仓库上. 具体过程参考[1].
具体push过程是通过一个插件[2]实现的. 因此需要将该插件添加到 pacakge.json中
{
...
"dependencies": {
...
"hexo-deployer-git": "^2.0.0"
...
}
...
}
使用该插件需要进行一些配置. 在 _config.yml中进行配置即可. 因为我们是使用公私钥进行操作的, 所以repo字段需要填写ssh对应的url. 如果使用了错误的url再执行Github Actions时会报错(因为没有权限往github.io仓库进行push操作), 报错信息如下.
...
remote: Permission to pullp/pullp.github.io.git denied to github-actions[bot].
fatal: unable to access 'https://github.com/pullp/pullp.github.io/': The requested URL returned error: 403
FATAL {
err: Error: Spawn failed
at ChildProcess.<anonymous> (/home/runner/work/blog-source/blog-source/node_modules/hexo-deployer-git/node_modules/hexo-util/lib/spawn.js:51:21)
at ChildProcess.emit (events.js:314:20)
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12) {
code: 128
}
} Something's wrong. Maybe you can find the solution here: %s https://hexo.io/docs/troubleshooting.html
...
deploy:
type: git
repo: git@github.com:pullp/pullp.github.io.git
branch: hexo-deploy
2.2. 文章加密功能
使用了一个插件[2]. 使用方法很简单. 首先将其加到pacakge.json中
{
...
"dependencies": {
...
"hexo-blog-encrypt": "^3.0.0"
...
}
...
}
然后对想要加密的文章在markdown文件头部添加password字段即可
---
...
password: 1234
---
...
至于一些站点配置和主题配置就不再赘述, 参考官方文档按照自己喜好来即可.[4][5]
首页显示缩写而不是整篇文章
Next主题默认主页是显示整篇文章, 不太喜欢这样, 希望是显示每篇文章的缩写.
设置方法有两种:
- 在文章中添加
<!-- more -->
tag - 在文章开头添加
experct:
属性, 同时在theme.config
里设置excerpt_description: true
详细方法参考官方文档[6]
3. 结语
经过上面的配置之后可以实现Jekyll
相同的易用性了. 写完markdown文件后push一下即可. 而且各种源文件还都备份在私有仓库中. 舒服了.
最近因为各种考试和比赛, 一直没有更新. 从这篇开始继续坚持每周更新一篇吧.