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 | 
提交代码重新部署即可成功。如果后续该插件有修复该问题,便可以移除这里的修改。