「2023.001|CN」Hexo NexT 升级笔记
升级的原因
以前的老 blog 是2016年使用 Hexo 和 NexT主题 搭建的,到2020年时这两个项目都有了巨大的变化,有了很多新的强大功能,所以在那时候更新过一次。
3年后的今天又到了值得更新的时候,与上次不同的是,这次与其说是更新,实际上是重新建站了,因为使用了新的 github 账号 pwnfan
和新的域名 pwn.fan
。
关于老 blog 里的文章,我会搬运那些至今仍未过时的内容到新 blog 里来。
关于 pwn.fan
pwn 是网络用语,在网络安全圈尤为流行,通常指“突破、超越”的意思,pwn.fan
作为域名,代表一种“热衷于不断创新和突破”的黑客精神。
跟老 blog 有什么不同
- 新 blog 使用了 github action:
- 这样就可以只用向 blog 的源码 repo(私有) push 新的 blog 源代码,通过这个 repo 里已经配置好了的 github action,就会自动生成静态的页面后 push 到另一个 github page 所在的目录 https://github.com/pwnfan/pwnfan.github.io
- 而老 blog 需要手动运行 hexo deploy 命令部署
- 新 blog 使用了 github action 的方式来部署静态文件,不需要项目录中添加 CNAME 文件。而旧 blog 采用从分支部署的方式,再需用向目录中添加 CNAME 文件
- 参考 Configuring a publishing source for your GitHub Pages site
- 参考 Managing a custom domain for your GitHub Pages site
stateDiagram state "github: blog/main" as s1 state "github: pwnfan.github.io/gh-pages" as s2 state "site: https://pwnfan.github.io" as s3 [*] --> s1: blog update commit note right of s1: private s1 --> s2: (through github action hook)\n1. build static pages\n 2. auto commit to note right of s2: public s2 --> s3: served by github
- 启用了多语言(英日中),并计划写多语言文章。
- 由于我在持续学习英语和日语,过去也尝试过写英文 blog,但使用多语言编写blog的工作量不小,保证高质量的翻译会花掉不少时间。而 ChatGPT 的出现使相对高质量的翻译的工作量减少了很多,所以之后我会尽量同时使用3种语言发布文章。
- 如果您只想浏览某一种语言的文章,可以使用页面最下方的语言切换菜单来切换
升级中遇到的问题及解决办法
自己定制的404页面不生效
问题
当访问不存在的页面时,显示的是 github 的 404 页面,如下图:
![github 404 page, not ours](/zh-CN/post/Hexo-NexT-Updating-Notes/1.png)
解决方法
在 404 页面的 Front-matter 里添加 permalink: /404.html
:
1
2
3
4
title: 404
permalink: /404.html
如何在 sitemap 时忽略某些页面
问题
生成 sitemap 时需要忽略某些页面,比如 404 页面。但 Hexo 和 Next 文档中都没有相关内容
解决办法
翻了一下 Hexo 的源码,了解到 sitemap 生成功能是使用了插件 hexo-generator-sitemap,插件 README里写了如何忽略某些页面,在页面的 Front-matter 里添加 sitemap: false
即可:
1
2
3
4
5
title: lorem ipsum
date: 2020-01-02
sitemap: false
多语言问题
请参考我针对多语言问题另写的一篇文章 「2023.002|CN」Issues系列:关于 Hexo 及 NexT 主题的多语言支持
Google Analytics
存在设置后不生效,无法通过 Google Analytics 统计阅读次数多问题。
分析原因,是由于 Google Analytics 已经升级到v4版本,tracking_id
的格式已变为 G-XXXXXXXXXX
,而旧版本格式是 UA-XXXXXXXXX-X
,具体可以参考这里。
如果按照 NexT 官方文档设置如下:
1 | # Google Analytics |
是没有问题的。
但是如果我们将 only_pageview
去掉,或者设置为 true
,则无法支持最新的v4版本的tracking_id
的,后来我确认了一下相关源码,确实是这样的。NexT官方文档里目前没有专门指出这个问题,也有人提出过相关的 issue。
根据 [GA4] Introducing the next generation of Analytics, Google Analytics 4 里的说明可以知道,Google 将在2023年7月1日停止对旧版本的 Google Analytics 的支持,这意味着届时使用 UA-XXXXXXXXX-X
这种旧的版本的 Google Analytics 的 tracking_id
的网站将不再能够利用它进行数据统计。建议大家自查上面讨论的相关配置,确保自己的 blog 届时功能正常。关于这个问题也有其他网友讨论过,可以参考 [實作筆記] Hexo 更新 Google Analytics 4
Firebase 配置问题
Next 官方文档针对 Firebase 配置 的描述几乎是一笔带过,然而实际的设置比较复杂,我遇到了各种问题。这里给出我找到的解决办法的文章,具体问题就不再一一讨论了:
- Hexo - Add View Count based on FireBase
- Application Note #4 - Configure hexo-theme-next
- 【2021年最新】React×firebaseにて「Uncaught (in promise) FirebaseError: Missing or insufficient permissions.」エラーが出力される原因とその対策
- 【解決】FirebaseError: Missing or insufficient permissions.
- https://firebase.google.com/docs/firestore/security/get-started?hl=en&authuser=0#deny-all
- Structuring Cloud Firestore Security Rules
- Fix: 'The Cloud Firestore API is not available for Datastore Mode projects.'
这里专门说一下其中涉及到的几个问题。
第一个,Firestore Database
默认工作模式是 Datastore mode
,所以文章阅读统计之类的信息在 Firebase 的主界面 Firestore Database
里看不到的,而是藏在 Google Cloud 中,这里直接给出:https://console.cloud.google.com/firestore/databases/-default-/data/panel/。
第二个,Firebase Database
role 的写法可能引发安全问题,我这里给出根据 Firebase 官方文档的安全写法,其中的 articles
是你创建的 collection 名:
1 | rules_version = '2'; |
Github Action 问题
前文提到我使用了 github action 来做 CI/CD,为了避免重复造轮子我直接使用了 sma11black / hexo-action,它是用于自动化部署的 Hexo CI/CD Action。
实际使用时发现在build的时候会报错 [hexo-renderer-pandoc] pandoc exited with code null.
根据 NexT主题文档,渲染数学/化学等科学公式的引擎有两个可供选择:
- MathJax
- 它需要依赖于
hexo-renderer-pandoc
- 它需要依赖于
- KaTeX
对比二者后,我选择使用的是 MathJax
,在配置文件里设置为它,且在本地安装了 hexo-renderer-pandoc
。
问题出现在 sma11black / hexo-action 制作的 docker 镜像中没有安装 hexo-renderer-pandoc
,造成为的 blog 通过它编译的时候会因为缺少 hexo-renderer-pandoc
而失败。
我在自己fork的仓库 pwnfan/blog-github-action 中 修复了pandoc的问题。