这个站换主题了。新主题叫 astro-narrow,是 hugo-narrow 的 Astro 重写版,代码以 AGPL-3.0 开源。
为什么换
之前用的是 astro-erudite。它把同一主题的多篇文章用 Subpost 组织进一个页面里内联渲染,设计上很先进,但读起来少了正常翻页的节奏——读完一节要继续往下滚,而不是点开下一篇。这次改回每篇独立成页。
另一个原因是排版。想要的东西很简单:单栏、正文窄一点、没有侧栏常驻,目录和搜索这些偶尔才用的东西收进浮动 dock 里,不占阅读空间。
它是什么
astro-narrow 不是把 Hugo 模板逐行翻译过来,而是按 Astro 的方式重写了一遍:功能和视觉对齐上游,实现上凡是能换成 Astro 原生能力的地方都换掉了——图片走 astro:assets,代码高亮用 Shiki,配置用 Zod 校验,目录来自结构化的 headings 而不是解析 HTML 字符串。
现在能用的
- 单栏阅读配浮动 dock,目录、搜索、菜单、外观面板都在浮层里
- 12 套配色,明暗和跟随系统三态,宽度、背景模糊、噪点可调
- 客户端搜索,
Ctrl+K打开 - 代码块双主题、语言标签、复制、超长自动折叠
- 数学公式构建时渲染,Mermaid 图表按需加载
- 相邻图片自动聚成画廊,支持布局切换和灯箱
- MDX 嵌入组件:按钮、链接卡、标签页、Bilibili 与腾讯视频
- 评论和统计按需开启,关掉时不发任何请求
- 界面文案支持 13 种语言,另有 RSS、sitemap 和 web manifest
和上游的差异
移植过程中有几处没有照搬 Hugo 的做法:
- 公式:KaTeX 在构建时渲染成静态 HTML,不再靠浏览器执行脚本,也不会出现先看到
$...$再跳成公式的闪动 - 短代码:Hugo 的
{{< button >}}换成了 MDX 组件,参数是真正的 props,写错会直接构建失败 - 子路径部署:
base会贯穿站内链接、封面图、搜索索引和 manifest,可以直接放到 GitHub Pages 的项目页下 - 不做内容级多语言:界面文案可以切语言,文章保持单语言。上游提供的也是界面字典,不是博文翻译
本站和主题的关系
这个站就是主题的在线示例,代码没有二次定制:所有定制只发生在配置和文章里,组件、布局、脚本都是主题原样。所以这里看到的功能,装好主题就是同一套,不会出现「博客上有、主题里没有」的情况。
以后要加功能,也是先改主题仓库再同步过来,不会在这里单独长出一套东西。
想自己用
git clone https://github.com/imsxx/astro-narrow.git
cd astro-narrow
pnpm install
pnpm dev需要 Node 22.23.4 以上和 pnpm 10。README 里有完整的功能开关表和部署说明,示例文章覆盖了各种排版写法,可以直接对着改。
旧链接还能用
文章路径从 /blog/<slug> 改成了 /posts/<slug>,旧地址仍然可以访问,打开会自动跳到新位置。搜索引擎收录的入口和外部引用都不受影响。
主题有问题或者想要某个功能,欢迎到 仓库 提 issue。
相关内容
四个零散的 WordPress 问题:插件导致的 CPU 爆满、发布文章无限加载、主题双 H1 修正,以及在所有文章第二段后插入广告。
记录那些年在WordPress付费主题上花过的冤枉钱~ B2、DUX、LightSNS、Rouse、DiVi