Aonote 近期更新:no-JS 静态博客生成器
算一算,距离我在小站里介绍 PureMo-Blog 已经过去三个月。那段时间它还是一个「能跑起来」的 Python 静态生成器;到了 5 月中旬,我又连着推了一轮改动,并正式更名为 Aonote。
这篇建站日志把近期 commit 收拢成一条线,方便自己回顾,也给你一张「现在生成器能做什么」的快照。
在线演示:aonote.vercel.app
这轮更新在做什么
Aonote 仍然坚持一件事:Markdown 进,纯 HTML/CSS 出。没有 React/Vue,也没有客户端运行时;移动端导航、目录折叠、回到顶部、锚点跳转都靠原生 HTML 与 CSS 完成。
5 月的迭代可以粗分成四条线:
- 写作侧:Markdown 富排版与代码块体验。
- 阅读侧:无障碍、键盘焦点、亮暗色代码主题。
- 分发侧:RSS、Atom、sitemap、Open Graph 等元信息。
- 工程侧:构建后健康检查,把明显问题拦在部署之前。
Markdown 与代码块
目标是作者只写 Markdown,生成器负责把常见技术博客排版一次做到位。主要改动包括:
- 冒号式 admonition(
::: note等)与更完整的样式示例。 - Emoji 短码、可选代码块标题、diff/patch 代码块(增删行样式,并补充读屏标签)。
- 表格支持
Table:/表格:形式的 caption;过宽表格可横向滚动。 - 数学公式在构建期渲染为 MathML,不依赖浏览器端数学引擎。
- 代码高亮切换到 GitHub Light / GitHub Dark Dimmed,并修正暗色对比度、长行横向滚动等问题。
无障碍与键盘体验
no-JS 不等于「天然无障碍」。HTML 语义、焦点顺序、读屏文案仍然要刻意设计。
- 页面级:跳过链接、导航
aria-current、可见键盘焦点、prefers-reduced-motion;锚点scroll-margin-top避免标题被 sticky header 挡住。 - 组件级:表格滚动区域、脚注、任务列表、diff 行补充读屏友好标签;键盘可操作的代码块与原生
<details>折叠。 - 构建期:A11Y 类健康检查(例如图片
alt缺失或过于笼统);可选python check_site.py --focus-report输出焦点顺序,便于人工走查 Tab 链。
这与此前 严格遵循 nojs.club 那轮修复是同一方向的延续。
订阅、SEO 与界面
分发与元信息
- 除原有 RSS 外,新增 Atom(
atom.xml),并增加 Feed 落地页。 sitemap.xml、robots.txt、canonical、Open Graph、Twitter Card、文章时间戳。- 真实
404.html且带noindex;BASE_URL、REPO_SUBPATH支持自定义域名与 GitHub Pages 子路径。 - 文章页结构化数据改为 Microdata,最终 HTML 里不再依赖
<script type="application/ld+json">。
界面与国际化
- 移动端汉堡导航(仍无 JS);归档、license 等文档型 UI 细节持续打磨。
- 可配置界面翻译(
i18n.py,支持zh-CN/en)。 - 生成 HTML 可选压缩;CSS 使用内容 hash 文件名,增量构建会清理旧的 hash CSS。
构建后健康检查
autobuild.py 在每次构建结束后会调用 check_site.py。检查不通过则不会更新构建 manifest,避免把明显问题带进部署包。报告按类别分组,例如 No-JS(页面是否含可执行脚本)、Links、SEO、Feeds、A11Y、Assets 等。
本地可这样跑:
python3 autobuild.py
python3 check_site.py --focus-report # 可选:焦点顺序报告仓库侧还做了 README 中英拆分、示例 Markdown 按主题拆开,以及移除代码里偏 changelog 的冗长注释——细节留在 Git 历史里即可。
结语
如果用一句话概括:Aonote 不再只是「把 Markdown 转成 HTML」,而是在 no-JS 前提下,把写作体验、阅读体验、订阅分发和构建后质检串成了一条可维护的流水线。
对我自己的这个小站来说,可以继续安心写随笔和技术笔记,而把「链接断了没有、Feed 是否完整、页面是否偷偷带了 script」交给构建脚本在发布前拦一道。后续如果 health check 或 Markdown 扩展还有新玩法,我也会继续在这里记录。
另见:Aonote 项目生态:三个入口怎么选 · 官网完整说明。