Hexo构建与部署
建议在看此篇文章之前弄懂什么是 CI/CD(持续集成),并拥有一定的 NodeJS 基础知识。
推荐阅读:
- 什么是 CI/CD ?
- Github Action 快速入门 建议开个空仓库练练手,编译一个 hello world 并输出。
心得 3.0
网上部署 hexo 博客多数都要用到hexo-deployer-git
这个插件,同时还要在_config.yml
中配置deploy
,这样每次部署都要手动运行hexo clean && hexo g && hexo d
,十分麻烦。
或许会有人嫌麻烦,自己写了一个 git 脚本或者是 python 脚本,自动化部署博客,不过在我看来,还是多了一个执行脚本的命令,不够优雅。(就像之前的我)
不过经过半年的工作和开源项目开发,我首先接触到了 AWS CI/CD,又接触了Github Action
。一个自然而然的想法就形成了,何不用Github Action
进行持续集成呢?
经过一番摸索,我总结出了如下流程:
CI/CD
创建博客仓库,名称命名为username.github.io
,注意,此仓库不仅作为博客编译后的 html 文件所在仓库,还将作为博客源码仓库,两个项目分属不同分支。
开创两个分支,名称什么都可以,我这里分别命名为master
(源码分支)和main
(编译文件分支)。
源码分支创建.github/workflows
文件夹,里面添加一个随便起名的yaml
文件。文件内容如下:
1 | name: Hexo # 名称随意 |
同时在帐号里开一个token
,名称随意,权限选择workflow
即可,添加到仓库的secrets
中,名称为PAGE
。(这里PAGE
也随意)
我这个配置文件有点长,不用 pnpm 包管理的同学可以去 github action 模板找一个 nodejs 的模板,那个短一点。
有了这个配置文件,每次 push 到master
分支,就会自动运行pnpm install
,pnpm run clean
,pnpm run build
,pnpm run deploy
,最后将编译后的文件推送到main
分支,一个网站就在云上被部署好了。
date 与 update
安装hexo-filter-date-from-git
即可,他这个单纯调用 git 命令获得这两个时间的,所以要注意文件名不要有空格,介意的话可以给这个库打个 patch, 或者提个 pr, 处理一下,源码一共就小几十行,很简单。
注意:windows可能会因为文件名编码问题导致不能用中文(猜的,我也不知道,总之建议 wsl)
自定义插件黑科技(或直接用脚本)
在博客目录下(或者其他地方也行,不过推荐博客目录)创建一个新的nodejs
项目,至少要包含package.json
与index.js
文件。同时项目名称(package.js 中定义的)要为 hexo 开头,就像其他插件那样。
博客项目安装子项目,这个网上有很多方案,我选择 pnpm 方案,这里不细说,可以 search the fucking web
或者研究下我的项目构成:
可以不使用子项目方案,直接在博客下面开一个 script 目录,写 js 文件也一样,代码是相同的
然后就可以在index.js
里编写插件代码了,API 参考 Hexo: API.
本人的自定义插件代码如下:
1 | /** @type {import("hexo")} */ // 解决编辑器的代码提示问题 |
主要实现了两个功能:
- 博客的封面与顶部图与分类页面的顶部图统一
- 将 mermaid 代码块翻译为 hexo 标签
写完此插件以后,我的页头几乎只要写四个内容就够了,比如本篇文章,其他几项都自动生成了,而且不会影响到文章的源代码。
1 | title: Hexo构建与部署 |
另外注意,不需要再费力气写 keywords
了,对 SEO 冇用,有的主题甚至都不搞 keywords 生成了,也就在文档里提一嘴(说的就是你,butterfly!)
替换渲染引擎为 markdown-it
这个基操了,参考將 Hexo 的 Markdown 渲染引擎換成 markdown-it
不要用 pangu 会变得不幸
butterfly 的 pangu.js
的 load 周期是在文章渲染之后才执行的,有点逆天,有的地方版式都被破坏了。
建议用prettier
,prettier 在格式化的时候也会自动在中英文间加空格,不过有的地方因为符号问题,不会加,这部分就自己手动加一下。
懒得一篇篇文章手动格式化的直接运行命令就好
1 | pnpm dlx prettier --write **/*.md |
设置 git 提交时自动格式化。
1 | pnpm i -D husky lint-staged prettier |
编辑.husky/pre-commit
:
1 |
|
编辑.lintstagedrc
:
1 | { |
这样在运行git commit
时,会自动格式化修改过的文件。
结语
不用hugo
用hexo
的原因之一就是因为 hexo 可扩展性强,而且背靠 NodeJS,生态可以说很好了,这对自定义要求高的使用者来说是件好事。(hugo 体验过一点点,但没仔细研究,莫喷)