HEXO 5.4 & NEXT 8.8.2 版本升级记录
原来HEXO的版本是3.6,都是几年前的老东西了,最近总是提示highlight.js
的旧版本存在安全漏洞,需要升级到10以上版本,此外由于node、next-theme-next等版本都存在不少问题,周末下定决心做一次版本升级。
一、目标版本环境
node 12.22.8
: 最新版本v17,推荐LTS版本v16.13.1,但是由于兼容性问题,本次采用v12的最新补丁版本。
另一方面,HEXO官方要求:Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本hexo 5.4
: 最新版本,2021年2月发布;相应hexo-cli的版本是4.3.0hexo-theme-next 8.8.2
: 最新版本的用户主题
1 | JiandeiMac:nokiam9.github.io sj$ hexo -v |
二、hexo的升级
要升级就彻底一点,把HEXO的全部依赖都升级到最新版本,参考以下步骤吧。
1. npm的全局软件更新
1 | # 清理NPM缓存 |
2. hexo当前目录的软件更新
1 | # 进入博客的根目录 |
3. 检查方法
在上述步骤完成后,package.json
将成为以下版本信息:
1 | { |
在其它开发机上,也可以依据已更新成功的package.json
,直接通过npm install
进行升级。
三、hexo-theme-next的升级
由于历史原因,next有3个不同的Github源码地址。
NexT 8.x 相比旧版,技术架构有重大变化,无法做到平滑升级,建议做好备份后全新安装,然后重新配置。
对比项目 | 旧版 | 新版 |
---|---|---|
安装方式 | git | npm、git |
安装目录 | themes/next | npm:node_modules/hexo-theme-next git:themes/next |
模板格式 | swig模板 | nunjucks引擎 |
字体图标 | Font Awesome 4.x | Font Awesome 5.x |
配置文件 | hexo/source/_data/next.yml | hexo/_config.next.yml |
源码地址 | v5:https://github.com/iissnan/hexo-theme-next v6 & v7:https://github.com/theme-next/hexo-theme-next |
v8:https://github.com/next-theme/hexo-theme-next |
原来的安装方法是通过git clone
,安装点位于theme/next
目录;
现在改为npm install hexo-theme-next
, 安装点位于node_modules/hexo-theme-next
。
原来的参数配置是:全局配置文件_config.yml
+ 主题配置文件theme/next/_config.yml
。
而在next 8.8.2,主题配置文件改为_config.next.yml
(从theme/next/_config.yml
拷贝,并改名而来)。
总体而言,npm方式更为优雅,而且目录结构得到精简。
四、如何在ECS云服务器上部署HEXO静态页面
Github提供了标准的用户主页展示功能,通过CI/CD为HEXO的静态页面提供部署环境,默认主页域名是https://xxxx.github.io
。
但是,我们也可以利用Git的钩子功能,将HEXO静态页面部署在自己的云服务器上,主要包含以下步骤:
1. 准备工作
- 独立的站点域名,并设置DNS指向ECS服务器
- 在ECS服务器上安装git、nginx
- 在ECS服务器上启动Nginx服务,并将该域名的root目录设为
/var/www
- 在ECS服务器上添加开发机的公匙(
$HOME/.ssh/authorized_keys
),为开发机提供root用户的免密登录
2. ECS服务器上设置Git Hooks
基本原理:在ECS服务器部署一个git仓库,作为hexo部署(deploy)的远端git仓库,每次提交时自动触发post-receive事件,用于更新nginx的静态页面。
1 | # 创建一个远端仓库 |
3. 开发机上部署hexo-depoly服务
Hexo的全局配置文件_config.yml
中,配置hexo-depoly服务,示例:
1 | # Deployment |
完成以上工作后,我们运行hexo d
时将触发上述2个服务,远端ECS服务器在接受到git推送信息后,触发post-receive钩子并更新/var/root
目录下的静态页面。
其实,Github的用户主页更新服务也是同样的原理。
五、常见问题
1. 首页的“节选”功能失效
原来是通过next配置文件的excerpt_description: true
,但next新版本剔除了这个功能,而是由hexo-auto-concerpt
插件实现此功能。
解决方案:安装npm install hexo-auto-concerpt
,或者修改package.json
后自动安装。
2. NodeJS为什么要选择版本12
NodeJS 从 12.0.0 才开始支持函数 String.matchAll(),如果 NodeJS 的版本低于 12.0.0,那么执行 Hexo 的构建命令就会出现错误
解决方案:v12是node的最佳版本
3. external_link
配置方法有变化
1 | # Deprecated |
4. Next更新后,头部菜单或尾部Page按钮出现乱码
凡涉及到引用 Font Awesome 的地方,图标名和调用方式要更新,比如旧版填写 home,新版要改为 fa fa-home,否则图标会显示乱码
1 | # 旧版 |
5. LocalSearch 失效的问题
开始你的Blog搜索功能还是正常的,搜索出结果一直在转圈圈等待,或者 搜索功能能搜索但是不能跳转过去,随着添加了几篇文章以后,搜索就不正常了,访问你的博客 http://你的博客域名/search.xml` 的时候,提示有存在不可解析的字节的错误,大致如下:
1 | This page contains the following errors:error on line 66 at column 35: Input is not proper UTF-8, indicate encoding ! |
此时,是因为你的xml解析有问题,换成json来解析即可,
解决方案:编辑你的站点配置文件_config.yml
,找到搜索的地方 把 Search的xml解析改成json解析
6. highlight.js的版本9存在安全漏洞,频繁出现告警信息
全部完成npm-check
和npm-upgade
之后,问题完美解决。