我所理解的 Hexo 最佳实践(3):用系列目录组织连载正文
文章拆成几篇以后,我在编辑器里常常要在一排相似标题之间找总览。把同一组 Markdown 放进目录就好找多了,但对 Hexo 来说,源路径还是读取文章元数据的输入。移动文件前,需要先弄清日期、标题和资源分别从哪里来。
系列目录按总览日期排序
目录名用总览文件名去掉扩展名。同一批整理的分篇沿用总览日期。以后补写续篇时,仍放进同一目录,文件名写该篇自己的发布日期和完整标题。
source/_posts/
└── 2026-10-03 - QQ 配色/
├── 2026-10-03 - QQ 配色.md
├── 2026-10-03 - QQ 配色(1):提取.md
└── 2026-10-04 - QQ 配色(2):复用.md
假设最后一篇的 url_title 是 qq-colors-2,它应该发布到 /2026/10/04/qq-colors-2/。用原版 Hexo 8.1.2 处理这个例子,日期却会取成父目录里的 2026-10-03,余下的目录名和文件名一起落进 :title。同日分篇只看 URL 时很容易漏掉这个问题,因为目录日期恰好等于文件日期。
Hexo 从读文件到生成页面
Hexo 8.1.2 的文章处理器先读 frontmatter,再拿相对于 _posts 的路径匹配 new_post_name。本站的规则是 :year-:month-:day - :title.md。当父目录以日期开头,前几个占位符就匹配到目录日期,剩下带 / 的部分则匹配到 :title。如果目录开头匹配不上,又没有显式 date,Hexo 会用文件创建时间。最后它把这些数据写入文章模型。
文件扫描结束后,Hexo 执行 before_generate。在 8.1.2 中,内置的正文渲染过滤器也在这里运行,只渲染还没有正文产物的文章。随后首页、归档和单篇文章等生成器各自读取站点数据,返回路由以及对应的模板数据。hexo generate 把路由内容写成静态文件,本地预览则用这些路由响应请求。
在正文渲染前补齐子篇元数据
同名过滤器按优先级数值从小到大执行,默认是 10。hexo-series-filename 把自己的 before_generate 过滤器设为 1,先于正文渲染运行。它只处理符合命名规则的子目录文章,从文件基本名取出日期和标题,同时保留 frontmatter 显式提供的 title 和 date。
文章数据更新后,正文渲染和连载排序就能使用新的标题。常规地址按 :year/:month/:day/:url_title/ 生成,例子里的续篇会使用 2026-10-04。如果该篇显式写了 permalink,Hexo 会按永久链接规则优先使用指定的地址。
插件要求开启 future: true。在 before_generate 之前,Hexo 已经用文章模型中的发布判断决定是否建立标签和分类关联。关闭未来文章发布后,初次解析出的未来日期可能让 Hexo 跳过这些关联。后续修正日期能恢复正确的 URL,但此时标签和分类的处理已经结束。
插件可以在哪一步做事
Hexo 支持两种插件加载方式。站点自己的逻辑可以放进 scripts/,独立插件则作为项目依赖安装,通常以 hexo- 命名。两种写法都通过 hexo.extend 注册逻辑。本站把 hexo-series-filename 放在 plugins/ 下,通过 pnpm 工作区安装。
| 扩展入口 | 适合处理的事 |
|---|---|
| Processor | 处理 source/ 下匹配规则的文件,例如读出文章的正文和元数据 |
| Filter | 在指定阶段调整数据,例如渲染前补齐元数据,或从标题派生连载排序键 |
| Renderer | 转换输入格式,例如把 Markdown 正文渲染为 HTML |
| Tag | 给正文增加构建期标签,例如用 code_lab 插入源码工作区 |
| Generator | 决定要生成哪些路由、每条路由带什么数据,例如给首页分页或生成搜索索引 |
选入口时,可以先找谁会读到你要修改的数据。标题和日期会被多个生成器共用,适合在生成前统一补齐。首页聚合只需要改变首页看到的文章集合,因此把 hidden 筛选放在首页生成器的输入里。
移动正文以后核对哪些地址
系列目录只多了一层 Markdown 源路径。图片和下载仍放在 source/files/日期 - 文章标题/,资源目录跟随实际所属文章的文件基本名。把正文从平铺目录移入系列目录后,Markdown 链接从 ../files/ 调整为 ../../files/。图片发布以后继续走 /files/<url_title>/…。 本地预览与公开资源映射
正文如果嵌入其他分篇的 Code Lab 或补充材料,通过 from=资源所属文章的 url_title 指明归属即可。这样换了阅读入口,仍然从原文件读内容。资源较多时,移动前后可以用独立 Hexo 数据库和输出目录各生成一次,按 url_title 对照文章标题、日期、canonical 和资源实际路径。
总览和正文怎么互相导航
总览先交代系列解决的问题,再用几句话介绍各篇。分篇开头放同一份目录,标出当前篇,从归档或搜索直接进来的读者也知道前后篇讲什么。跨日续篇按自己的日期发布,章节次序则由目录给出。需要让首页只出现总览时,再单独处理首页聚合。