
部署同步更新博客文章FrontMatter

前情提要
之前在某篇文章中提到了 Qexo 的一项优点:右侧支持自定义 Markdown 的front-matter
,同时默认自动添加updated
属性,实现只要我们更新文章,发布时间date
属性值不变,updated
属性会变成当前时间,但是生成的时间格式为ISO 8601
标准,同时带有时区+8:00
后缀(如:2024-08-06T01:44:42.550+08:00),导致在文章中显示的日期是 UTC+0 的时间,即与当地时间相差 8 小时。
本文主要解决两个问题:
- 更改日期生成格式。
- 保证
expires
的值与updated
一致,expires
是 Redefine 主题自带属性,本身指最后一次更新时间,定义上与updated
是相同的。
思路
笔者在这里绕了不少弯路,这件事也提醒我规划和预期的重要性(当然还有自身的技术力不足)。
正确的解法
幸好 Qexo 开源,为什么一开始没想到呢?可恶!
Qexo 源码开源,可以直接通过修改源码达到我们想要的功能。
1 | # 拉取自己仓库的分支 |
需求一:时间格式化
由于创建文章后发布时间是不变的,因此后续不会有其它方法处理该属性。而更新时间需要每次打开文件就修改。
修改创建时间
- 进入
hexoweb
目录,找到function.py
,修改get_post_details
函数 - 将时间格式化方式由
isoformat()
更改为strftime('%Y-%m-%dT%H:%M')
。
- 进入
修改发布时间
进入
templates/home
目录,里面的edit.html
和edit_page.html
中涉及到关键字updated
,其中涉及到处理时间的代码为content=getRFC3339()
进入
templates/includes
目录,查询关键字getRFC3339()
,更改函数为:1
2
3
4
5
6
7function getRFC3339() {
let date = new Date(+new Date() + 8 * 3600 * 1000);
let iso = date.toISOString();
let rfc = iso.replace("Z", "+08:00");
// 格式化为 YYYY-MM-DDTHH:MM
let rfc = iso.replace("Z", "").slice(0, 16); // 去掉 "Z" 并截取到分钟
return rfc;
需求二:绑定 expires 属性与 updated 属性
由于
updated
是 Qexo 编辑文章时自带的属性,因此源码里面一定有该字段。涉及页面相关的源码文件有:edit.html、edit_page.html、new_page.html、new.html,前者是对之前的文章进行更新,后者是创建新的文章
注意:只有过期日期格式为 %Y-%m-%d %H:%M:%S时,才会生效
找到 templates/home/edit.html,找到showSidebar(first = false)
函数,修改如下:
1 | # 更改前 |
待自动重新部署后,在 Qexo 编辑界面新建expires
属性即可。
别忘了 git 提交修改。
失败的尝试
思路 1:不改变 Markdown 文档本身,改变 Hexo 读取原始文档后的data
数据,修改updated
和expires
属性,最终实现渲染后的文章显示正确。
原因剖析
此思路在于脚本未能正确处理时间,由于date
、updated
和expires
涉及到moment
类和datetime
之前的转化处理,脚本一直执行报错,故放弃。
思路 2:直接更改源文件,读取 Markdown 文档本身,解析front-matter
,然后修改updated
和expires
属性。
原因剖析
此思路对于本地部署可行,但对于部署在 Github 仓库中的文件,Vercel 进行自动化部署时并不会更改仓库的原始文件, 因此无效。
折中办法:使用 Vercel 配合 Github Actions,当 Vercel 触发部署时,自动运行 Actions,Actions 再调用脚本,从而修改原始文件。
此处贴上思路 2 的源代码:
1 | const fs = require("fs"); |
- 标题: 部署同步更新博客文章FrontMatter
- 作者: Salt
- 创建于 : 2024-08-06 01:44:43
- 更新于 : 2024-10-26 21:53:10
- 链接: https://blog.isoland.top/posts/7e560f53/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。