Hexo静态博客升级指南(2021年版)

本文简要概述了本网站的 Hexo 与 NexT 升级过程。对于具体的细节则不会做过多解释,主要展示步骤。

升级前后的运行环境对比:

1
2
3
4
5
node: v14.4.0     => v16.13.0
npm: 6.14.7 => 8.1.4
hexo: 4.2.1 => 5.4.0
hexo-cli: 3.1.0 => 4.3.0
NexT: 8.0.0-rc.4 => 8.8.1

请注意,本文是基于旧版本的更新教程,对于需要全新安装的读者,请移步Hexo静态博客指南:本站是如何诞生的(2021年版)

准备工作

升级 Node.js

在已安装 Node.js 的情况下,推荐使用如下方法升级:

1
2
3
sudo npm install -g npm
sudo npm install -g n
sudo n stable

升级 Hexo

1
npm install -g hexo-cli

升级项目依赖包

在项目根目录下运行:

1
2
3
sudo npm i -g npm-check-updates
ncu -u
npm install

升级 NexT

对于 NexT 主题,我们设置了 git submodule。如果你在一台新的计算机上对项目进行 git pullsubmodule 中的文件不会被拉取。你需要运行以下命令手动拉取:

1
git submodule update --init --recursive

随后运行如下命令升级:

1
git submodule update --recursive --remote

此时查看 git status 可以查看到 modified: themes/next (new commits)。这是一种升级方法,但现在 NexT 主题可以直接通过 npm 安装,所以我们可以直接移除 submodule,通过 npm 重新安装一遍:

1
2
3
4
5
rm .gitmodules
git rm -r themes/next
rm -rf themes/next
rm -rf .git/modules/themes/next
npm install hexo-theme-next

移除submodule后,可以对工作流做两点改动。首先,在“Checkout repository master branch”处,可以去掉以下语句:

.github/workflows/main.yml
1
2
3
4
5
    steps:
- name: Checkout repository master branch
uses: actions/checkout@master
- with:
- submodules: true

其次,因为新版本的Hexo主题不再自带源代码,而使用npm安装,所以可以使用npm卸载原主题,并把卸载语句加入工作流:

1
npm uninstall hexo-theme-landscape # 加入工作流 Install hexo 部分

本地测试

首先运行以下命令:

1
2
3
hexo clean
hexo g
hexo s

如果遇到 unknown block tag: note 之类的错误,是因为 Hexo 不认识 NexT 主题的 tag。这可以通过重装该主题解决:

1
2
npm uninstall hexo-theme-next
npm install 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

此外还可以根据最新文档修改以下部分:

_config.yml
1
2
3
4
5
6
7
8
9
# Date / Time format
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss
## Use post's date for updated date unless set in front-matter
- use_date_for_updated: false
+ updated_option: 'date'

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
2
3
4
5
6
7
8
9
/home/runner/work/blog/blog/node_modules/hexo-leancloud-counter-security/index.js:73
this.log.info('leancloud.memo successfully updated.');
^

TypeError: Cannot read properties of undefined (reading 'log')
at postOperation (/home/runner/work/blog/blog/node_modules/hexo-leancloud-counter-security/index.js:73:10)
at /home/runner/work/blog/blog/node_modules/hexo-leancloud-counter-security/index.js:151:21
at processTicksAndRejections (node:internal/process/task_queues:96:5)
Error: Process completed with exit code 1.

这个问题属于 hexo-leancloud-counter-security 插件的 bug,但是截止目前并没有进行官方修复。在 GitHub 上有这样一个 PR,我们可以利用它更新一下我们的工作流。

首先,在博客根目录下找到 node_modules/hexo-leancloud-counter-security/index.js,复制全部内容至新文件 source/_data/hexo-leancloud-counter-security-fix.js,并根据该 PR 做出如下修改:

source/_data/hexo-leancloud-counter-security-fix.js
1
2
3
4
5
6
7
8
9
10
11
12
- function postOperation(env, cnt, limit, newData, memoData) {
+ function postOperation(env, cnt, limit, newData, memoData, log) {

...

- this.log.info('leancloud.memo successfully updated.');
+ log.info('leancloud.memo successfully updated.');
}

# 以下共有四处修改
- postOperation(env, cnt, limit, newData, memoData);
+ postOperation(env, cnt, limit, newData, memoData, log);

修改完毕后,在工作流加入如下内容(在部署步骤之前):

.github/workflows/main.yml
1
2
3
4
5
+   # 临时修改: hexo-leancloud-counter-security
+ - name: Temporary fix hexo-leancloud-counter-security
+ run: |
+ mv node_modules/hexo-leancloud-counter-security/index.js node_modules/hexo-leancloud-counter-security/index.js.bak
+ mv source/_data/hexo-leancloud-counter-security-fix.js node_modules/hexo-leancloud-counter-security/index.js

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