博客三次重构:Hugo、Astro到Hexo

博客是静态站:Markdown写作,内容推送到仓库,GitHub Pages出站。
文章格式一直是Markdown加front-matter,三次迁移换的都是主题。下面是三次用过的引擎、目录结构和配置。

Hugo Astro Hexo
语言 Go Node Node
安装 单二进制 npm npm
站点配置 config.yml astro.config.mjs _config.yml
输出目录 public dist public
主题索引 themes.gohugo.io astro.build/themes hexo.io/themes

第一版:Hugo

Hugo用Go编写,安装是一个二进制文件,放进PATH即可使用,不需要Node环境。全站一个配置文件,文章按目录组织,主题放在themes目录(直接放或用git submodule管理)。front-matter支持TOML、YAML、JSON三种格式。当时用的版本是0.165.0。本地预览是hugo server,生成是hugo,输出在public目录。

1
2
3
4
5
6
content/
posts/
2026-09-08-hello-world.md
themes/
PaperMod/
config.yml

主题是PaperMod,自带排版、深色模式、目录(TOC)、代码高亮和搜索。星空背景、鼠标点击特效、访问统计不在主题里,需要自己写CSS和JS挂在主题外面。这几个效果要维护的代码量接近主题本身。所以换掉了。

第二版:Astro

Astro属于Node生态,用npm装依赖,配置文件是astro.config.mjs,构建输出到dist目录。

1
2
3
4
5
6
7
8
src/
content/
blog/
hello.md
layouts/
BlogPost.astro
astro.config.mjs
package.json

内容集合是它的一个机制:文章的front-matter字段在TypeScript文件里定义,不符合schema的字段会在构建时报错。输出默认不含前端框架的JavaScript,需要交互的组件单独声明。本地预览是npm run dev。

日常使用上,改配置后要重新执行npm install和npm run build,node_modules目录装下来几百兆。所以换到了Hexo。

第三版:Hexo

Hexo属于Node生态,当前版本8.1.2,主题是开源的安知鱼(anzhiyu),版本1.7.0。

1
2
3
4
5
6
7
source/
_posts/
2026-09-08-hello-world.md
themes/
anzhiyu/
_config.yml # 站点配置
_config.anzhiyu.yml # 主题配置(站点级覆盖)

配置两层:站点_config.yml管生成与目录参数,_config.anzhiyu.yml管外观和功能开关。新建文章用hexo new,本地预览用hexo server,生成用hexo generate,输出在public目录。主题自带星空背景、鼠标点击特效、首页打字机、本地搜索、字数统计、访客统计、深色模式、繁简转换、版权声明、音乐页、分类标签归档页、图片灯箱、相对时间,都在主题配置里开关,不用自己写代码。其中本地搜索由生成search.xml、前端检索实现,不依赖外部服务。

默认字体是霞鹜文楷,文章支持封面图、置顶、分类和标签。背景粒子和首页头图自写脚本放置。定制放在_config.anzhiyu.yml里,主题更新不受影响。

三个引擎的产物都是纯静态文件,HTML加CSS加JS,不需要服务端。