拥有独一无二的主题,是个人博客最高的品位。但在传统博客里,改主题常常像在排雷:HTML 里混着复杂的嵌套运算,CSS 动辄几千行手写层叠样式。你本来只是想把侧边栏往右挪 2 个像素,结果刷新一看,页脚备案号右移了 2 个像素,而导航菜单,直接飞出了太空。
RustPress 采用了一套架构极其清爽的主题体系。底层基于 Rust 社区成熟的 Tera 模板引擎(语法与 Python 的 Jinja2 / Django 模板几乎完全一致),配合前端主流的 Tailwind CSS 原子化样式库,结构分明、改动透明,而且在本地调试时支持毫秒级热刷新。
一、主题标准目录架构
所有主题存放在 themes/<主题名称>/ 目录下。一个规范的主题包结构如下:
themes/light/
├── templates/ # Tera HTML 模板目录
│ ├── base.html # 全站基础骨架(Header、Meta、导航、Footer)
│ ├── index.html # 标准博文分页列表页
│ ├── home.html # 复合定制型首页(Hero 横幅 + 动态 + 文章)
│ ├── post.html # 单篇博文详情页
│ ├── columns.html # 专栏总览与专栏主页
│ ├── doc-item.html # 专栏章节阅读页(带左侧目录树)
│ ├── ... # 其他内容模型模板
│ └── components/ # 可复用局部小组件
│ ├── hero.html # 首页大图横幅
│ ├── sidebar.html # 侧边栏(热门标签、分类、精选文章、名片)
│ ├── author-bio.html # 作者卡片与打赏组件
│ └── toc.html # 文章大纲悬浮窗
├── src/ # 样式源码
│ └── input.css # Tailwind CSS 源码入口
├── static/ # 静态资产(构建时完整复制至 public/static/)
│ ├── css/
│ │ └── main.css # Tailwind 编译产出的最终 CSS
│ ├── js/
│ │ ├── alpinejs.min.js # 轻量前端交互库(下拉菜单、移动端抽屉)
│ │ └── lunr.min.js # 客户端离线全文检索库
│ └── images/ # 默认头像、占位图与背景
├── tailwind.config.js # Tailwind CSS 配色与断点配置
├── postcss.config.js # PostCSS 插件配置
└── package.json # 主题样式编译依赖
Tailwind CSS 原子类支持在 HTML 中就地声明样式,免去了在样式表里起名的困难;但在复杂布局中过度堆砌原子类会导致 HTML 标签极其臃肿,冗余,难以维护。合理的作法是,页面局部的微调与排版直接使用原子类;跨页面高频复用的 UI 结构封装进 components/*.html 做成独立组件。分界点很好判断,在于「样式属于局部排版还是全站公共组件」,如果是后者,就大胆封装成组件。
二、内置主题对比:default vs light
RustPress 开箱自带两套经过细致打磨的官方主题,适应不同的内容风格:
1. default 主题(经典科技与沉稳布局)
- 设计风格:经典科技风,强调信息密度与多栏结构;
- 视觉特征:深色调导航、清晰的边框分割线、结构严谨的侧边栏卡片;
- 适用场景:适合内容品类多、多分类、多标签的综合性技术博客、团队知识库与开发者门户。
2. light 主题(现代极简与通透呼吸感)
- 设计风格:极简现代、清爽通透,具备大面积的留白与呼吸感排版;
- 视觉特征:
- 极光薄荷色(
cyber-mint)与深墨色(moss-ink)配色; - 无阴影,无边框,直角卡片;
- 针对中文阅读精细调校的字体行高与字距;
- 极光薄荷色(
- 适用场景:适合个人深度长文写作、连载专栏、现代极客与追求排版美感的创作者。
三、主题快速切换
在 config.toml 中,只要改动一行参数即可实现主题无缝切换:
[theme]
name = "light" # 可选: "default" 或 "light"(或你的自定义主题名)
保存文件后,本地开发服务器自动重新编译,浏览器瞬间呈现全新主题。RustPress 的内容和主题是完全分离的,你换了主题并不会影响搜索引擎抓取,因为重复抓取抓到的内容是相同的。但页面是有样式的,换主题相当于重新生成全站,所以只建议在建站初切换主题,以后定了就不要变动了。
下一篇,我们来逐个盘点 templates/ 目录下的每个模板文件与组件的具体作用。