Hexo静态博客升级指南(2021年版)
本文简要概述了本网站的 Hexo 与 NexT 升级过程。对于具体的细节则不会做过多解释,主要展示步骤。
升级前后的运行环境对比:
1 | node: v14.4.0 => v16.13.0 |
请注意,本文是基于旧版本的更新教程,对于需要全新安装的读者,请移步Hexo静态博客指南:本站是如何诞生的(2021年版)。
准备工作
升级 Node.js
在已安装 Node.js 的情况下,推荐使用如下方法升级:
1 | sudo npm install -g npm |
升级 Hexo
1 | npm install -g hexo-cli |
升级项目依赖包
在项目根目录下运行:
1 | sudo npm i -g npm-check-updates |
升级 NexT
对于 NexT 主题,我们设置了 git submodule
。如果你在一台新的计算机上对项目进行 git pull
,submodule
中的文件不会被拉取。你需要运行以下命令手动拉取:
1 | git submodule update --init --recursive |
随后运行如下命令升级:
1 | git submodule update --recursive --remote |
此时查看 git status
可以查看到 modified: themes/next (new commits)
。这是一种升级方法,但现在 NexT 主题可以直接通过 npm
安装,所以我们可以直接移除 submodule
,通过 npm
重新安装一遍:
1 | rm .gitmodules |
移除submodule
后,可以对工作流做两点改动。首先,在“Checkout repository master branch”处,可以去掉以下语句:
1 | steps: |
其次,因为新版本的Hexo主题不再自带源代码,而使用npm
安装,所以可以使用npm
卸载原主题,并把卸载语句加入工作流:
1 | npm uninstall hexo-theme-landscape # 加入工作流 Install hexo 部分 |
本地测试
首先运行以下命令:
1 | hexo clean |
如果遇到 unknown block tag: note
之类的错误,是因为 Hexo 不认识 NexT 主题的 tag。这可以通过重装该主题解决:
1 | npm uninstall hexo-theme-next |
配置文件更新
部署时,发现终端有这么一条输出:
1 | `next.yml` is deprecated. Please upgrade to Hexo 5 or later and use `_config.next.yml` instead. |
按照指示操作(更详细的设置参见官方文档):
1 | mv source/_data/next.yml _config.next.yml |
此外还可以根据最新文档修改以下部分:
1 | # Date / Time format |
Valine 评论系统的问题
根据这条 GitHub Issue,Valine 评论系统在 NexT v8.1.0 后被移除。理由如下:
Valine 使用 Leancloud 作为后端,是一个深受静态博客用户喜爱的评论系统。然而 Valine 暴露出了一些令人担忧的问题:
- NexT 团队曾多次收到关于 Valine 评论系统存在隐私数据泄露的反馈;
- Valine 自 1.4 版本起不再开源,发布的打包版本中存在未告知用户的百度统计代码;
- 2020 年 11 月下旬出现了针对 Valine 评论系统的网络攻击;
- CVE-2021-34801
如需继续使用,需要额外安装插件。在项目根目录运行如下命令:
1 | npm install next-theme/hexo-next-valine |
Valine 即可正常运行。之后会考虑将评论系统从 Valine 迁出,会另外写文章说明。
远程部署
提交代码后,发现 GitHub Actions 部署遇到了如下问题:
1 | /home/runner/work/blog/blog/node_modules/hexo-leancloud-counter-security/index.js:73 |
这个问题属于 hexo-leancloud-counter-security
插件的 bug,但是截止目前并没有进行官方修复。在 GitHub 上有这样一个 PR,我们可以利用它更新一下我们的工作流。
首先,在博客根目录下找到 node_modules/hexo-leancloud-counter-security/index.js
,复制全部内容至新文件 source/_data/hexo-leancloud-counter-security-fix.js
,并根据该 PR 做出如下修改:
1 | - function postOperation(env, cnt, limit, newData, memoData) { |
修改完毕后,在工作流加入如下内容(在部署步骤之前):
1 | + # 临时修改: hexo-leancloud-counter-security |
提交代码重新部署即可成功。如果后续该插件有修复该问题,便可以移除这里的修改。