博客排序改为最新优先
直接修复博客里“有些地方还是旧内容排前面”的问题,把目录树与知识库索引统一改为最近更新优先。
一、背景
1.1 问题现象
用户指出博客里虽然首页“最近更新”看起来正常,但站点整体浏览体验仍有“不是最新在前”的问题。
实际排查后确认:
- 首页
RecentNotes本来就是按最新时间倒序; - 标签页与文件夹页列表本来也偏向按时间倒序;
- 仍然明显不符合“最新在前”直觉的地方,主要有两处:
- 左侧目录树
Explorer默认按字母排序; 知识库索引.md内部组内排序主要按路径名,而不是按真正更新时间。
- 左侧目录树
1.2 目标
- 把知识库索引改成按
updated/created/date倒序 - 把左侧目录树改成按最新时间倒序
- 保留文件夹优先显示
- 本地构建验证无误后再发布
1.3 约束条件
- 不能只凭感觉改,需要先确认 Quartz 相关数据结构是否真的带日期;
- 不能破坏 RSS / sitemap / 内容索引原有生成逻辑;
- 修改后必须真实构建验证,而不是只改源码不验证;
/data空间紧张,执行前需检查磁盘。
二、方案设计
2.1 技术方案
| 问题点 | 原行为 | 修复方式 | 结论 |
|---|---|---|---|
| 知识库索引 | 按路径名排序 | 解析 frontmatter 的 updated / created / date,按时间倒序 | ✅ 采用 |
| 左侧 Explorer | 文件夹/文件按字母序 | 在 Explorer.tsx 中按 node.data.date 倒序,时间相同再按名称兜底 | ✅ 采用 |
| 前端可用日期 | contentIndex 生成时删除了 date | 保留 date 字段供 Explorer 排序使用 | ✅ 采用 |
2.2 实现思路
知识库 md frontmatter
-> generate_kb_index.py 解析 updated/created/date
-> 生成 INDEX / 知识库索引(最新优先)
Quartz 内容索引
-> contentIndex 保留 date
-> Explorer 读取 node.data.date
-> 目录树按最新优先排序2.3 关键决策
- 文件夹仍然放在文件前面,避免目录树层级感被破坏;
- 同时间或缺少时间字段时,仍用标题字母序作为兜底;
- 不改首页
RecentNotes,因为它本来就是正确的,避免无谓风险。
三、执行过程
3.1 步骤记录
步骤1:确认真正的异常点
检查后确认:
RecentNotes已按最新倒序;- 标签页/文件夹页列表已基本正常;
Explorer和知识库索引.md才是主要问题。
结果:✅ 锁定改动范围,避免误改。
步骤2:修改知识库索引生成脚本
编辑 /data/nanobot-workspace/scripts/generate_kb_index.py:
- 新增 frontmatter 解析函数;
- 新增
parse_sort_datetime(); - daily / projects / learning 三类条目都改为按
sort_dt倒序; - 若 frontmatter 时间缺失,则回退到文件
mtime。
结果:✅ 索引排序依据从“路径名”改为“真实时间”。
步骤3:修改 Quartz 内容索引
编辑 /data/ysdmh-new/quartz/plugins/emitters/contentIndex.tsx:
- 保留
date字段,不再在简化索引阶段删除。
结果:✅ 前端 Explorer 可以拿到页面日期。
步骤4:修改 Explorer 排序逻辑
编辑 /data/ysdmh-new/quartz/components/Explorer.tsx:
- 保持“文件夹优先”;
- 同类型节点按
node.data.date倒序; - 日期相同或缺失时,再按
displayName字母序兜底。
结果:✅ 左侧目录树改为最近更新优先。
步骤5:生成索引并构建验证
执行:
python3 /data/nanobot-workspace/scripts/generate_kb_index.py
rsync -a --delete --exclude 'index.md' --exclude 'index.md.bak' /data/knowledge-base/ /data/ysdmh-new/content/
npx quartz build结果:
- 索引生成成功;
- Quartz 构建成功;
- 抽样检查确认
知识库批量补双链并发布已排在AI新闻汇总前面。
四、遇到的问题
问题1:Explorer 原本拿不到可用于客户端排序的日期
现象:虽然后端 ContentIndex 里有 date,但简化输出时被删掉了,导致前端排序只能靠名称。
原因分析:之前为了压缩内容索引,保留了 description 删除逻辑,同时也把 date 一起删掉了。
解决方案:只删除 description,保留 date 给前端用。
验证结果:✅ public/static/contentIndex.json 中已可见 date 字段。
问题2:知识库索引“日期分组正确”不等于“组内顺序正确”
现象:虽然已经按 2026-04-22 / 2026-04-12 / 2026-04-09 分组,但组内仍可能是旧文章排在前面。
原因分析:组内排序原来主要按路径字符串倒序,不等于真正的更新时间顺序。
解决方案:解析 frontmatter 时间并建立统一 sort_dt 字段。
验证结果:✅ 09:31 的《知识库批量补双链并发布》已排在 09:06 的《AI新闻汇总》前面。
五、结果与验证
5.1 最终结果
知识库索引.md组内条目已按最新更新时间优先;- 左侧
Explorer已由字母序改为最新优先; - 首页
RecentNotes保持原有正确行为; - 本地 Quartz 构建通过。
5.2 验证方式
- 读取生成后的
/data/knowledge-base/知识库索引.md检查顺序; - 检查
/data/ysdmh-new/public/static/contentIndex.json是否包含date; - 检查构建产物中 Explorer 的
sortFn已变为按时间排序; - 执行
npx quartz build确认站点能正常生成。
5.3 影响范围
本次改动主要影响:
- 知识库索引页面的显示顺序;
- 左侧目录树的排序逻辑;
- 静态内容索引中保留
date字段。
不影响:
- 文章正文内容;
- 首页导航结构;
- 自动同步与定时早报流程。
六、反思与改进
6.1 做得好的
- 先定位“到底是哪几个位置不对”,没有把本来正常的模块也一起乱改;
- 改完后真实生成索引并构建验证,避免只停留在源码层;
- 同时修正了“索引排序”和“目录树排序”,体验更一致。
6.2 需要改进的
- 以后新增列表/目录类功能时,应统一先明确排序依据是“标题、路径、创建时间还是更新时间”;
generate_kb_index.py目前 frontmatter 解析还是轻量实现,后续如果元数据更复杂,可考虑更稳健的 YAML 解析。
6.3 后续建议
- 若用户还希望首页文章列表、标签页、文件夹页完全统一成“最近更新优先”,可以继续做全站排序口径梳理;
- 若知识库继续增多,可给索引增加“最近 7 天更新”快捷区块。
七、参考资料
相关文件
/data/nanobot-workspace/scripts/generate_kb_index.py/data/ysdmh-new/quartz/components/Explorer.tsx/data/ysdmh-new/quartz/plugins/emitters/contentIndex.tsx/data/knowledge-base/知识库索引.md