搭建静态博客时考虑的技术的的问题。
2021-01-09:又重写了博客。本文已经非常过时。
2021-02-14:更换为 Gatsby 生成器后,本文内容已经过时。
纯前端的静态网站加载速度应当都是快于 WordPress 等后端渲染方案的,而且还能节省下服务器的费用。所以这里主要谈静态的博客。
托管
由于 某些 原因,在 ECS 上托管博客并不是个稳妥的选择。因此还是选择静态网站托管商。GitHub Pages 显然是最方便直接的选择,因为:
- GitHub 是一家较为可信的公司(不容易跑路,且服务质量高)
- GitHub Pages 免费,且功能完整
但是出于 某些 原因,其访问不稳定。因此有必要考虑一个备选方案。
Vercel 专职提供静态网站托管,而且支持从 GitHub 仓库直接部署。但 Vercel 访问速度不够快。
Gitee 也提供静态网站托管服务(需要实名认证),但免费版不支持随 git 提交自动部署,只能手动部署。而且 Gitee 不支持托管某些格式的文件(比如 .txt),此外,有时还会有奇怪的文字编码问题。它的最大优势就是速度快。另在 Gitee 上部署一份镜像是可行的方案。
部署
2021-02-15:换用 Gatsby 以后不再使用绝对链接,替换步骤可以省略了😊。
把部署成品所在的文件夹设为 git 仓库,再上传到 GitHub。我使用的生成器没有提供部署到远程的功能,所以手写了一个脚本,把部署和 git 推送到远程服务器两个步骤绑在一起。
GitHub Action 在提交后触发,制作镜像(很不优雅):
- 检出仓库
master
分支的最新一次提交到master
文件夹。注意,此时在 CD 服务器上的仓库里只有这一次提交,没有master
分支以往的提交和其他分支,但远程服务器(remote
)则绑定好了 GitHub 仓库的master
分支。 - 检出仓库
gitee
分支的最新一次提交到gitee
文件夹,这时分支的远程服务器就是gitee
分支。 - 土味替换 🤦:把
gitee/.git
文件夹取出来,删掉master/.git
文件夹,再删掉gitee
文件夹(如果直接覆盖,可能有一部分存在于旧版本而不存在于新版本的文件被保留下来,因此必须清空),再把master
文件夹拷贝到gitee
文件夹(其实就是重命名),最后把之前取出来的gitee/.git
放回去。 - 部署成品里面用于页面间导航的 URL 设成了绝对路径,要把所有 URL 中的
{username}.github.io/blog/
替换成{username}.gitee.io/blog/
。 - 提交到
gitee
分支。 - 使用第三方 Action 将库镜像到 Gitee,并触发 Gitee Pages 部署
gitee
分支。
同时,GitHub Pages 会自动部署 master
分支。
静态网站生成器
静态网站生成器多种多样,选用哪一个比较见仁见智,因此放在最后。对于个人来说,我目前使用的是 Hugo。
不过它也有十分显著的缺点:
- 接口设计复杂,引入了不少术语,经常需要翻阅文档。
- 文档内容比较简略,有时一笔带过。
- 如果需要修改主题,需要一定的 Golang 基础。Golang 的模板语法个人认为有些诡异。
- 社区不够活跃,生态不够完整。虽然主题较多,但是插件比较少,网上的教程也不多(尤其缺乏中文教程)。
- Markdown 渲染能力差。Golang 自带的 Markdown 渲染器虽然快,但功能不全,且不够稳定,最后我换用了外置 Pandoc 进行渲染。
因此我选中并维持在 Hugo 主要是看中了它的速度。不过,随着折腾和自定义的欲望增加,我也考虑过迁移,只不过出于爱护肝而选择了继续苟在 Hugo(已经迁移了 ::真香::)。
NexT 主题基本上由开发者包办了一切,包括评论系统、数学公式,等等,都已经内置好了,教程也十分详细,唯一的缺点就是用的人实在是太多了,可能不够彰显个性。我曾经尝试过 NexT 主题,在规模很小的时候,和 Hugo 速度差异并不显著。
Vuepress 是 Vue 官方推出的生成器,主要用于制作 Vue 文档,不过也可以生成博客。我曾经尝试过,似乎在性能方面问题更严重(和 Hugo 采用类似主题而仅有少量测试内容的情况下,启动耗时 7 秒),而且热加载之前似乎存在一些问题(这次测试似乎正常,速度也是 0.1 毫秒量级),因此放弃。
如果想要在博客中如果需要超高的自由度且不再需要肝,Gatsby / Gridsome 应该是首选。
至于 GitHub Pages 自带的 Jekyll,Jekyll 是基于 Ruby 语言的,Ruby 语言似乎在走下坡路,因而感觉 Jekyll 的前途也有些灰暗。而基于 Python 的 Pelican 和 MkDocs 我没有试过,不过据 OI Wiki 团队说 MkDocs 自由度不够,在考虑换用 Gatsby。
其他的生成器我没有了解过,在这里就不讨论了。