Astro-Theme-Aither 使用指南
安装、配置、自定义和部署 Astro-Theme-Aither 所需的一切,都在这一篇文章里。
本指南涵盖从零开始到完成部署多语言博客的全部内容。你可以从头读到尾,也可以直接跳到需要的章节。
前置条件
- Node.js 22 LTS 或更高版本
- pnpm 10 或更高版本
- 一个 GitHub 账号
- 一个 Cloudflare 账号(用于部署)
安装
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.gitcd YOUR_REPOcorepack enablepnpm installpnpm validatepnpm dev在浏览器中打开 http://localhost:4321,你会看到默认的博客页面。
项目结构
src/├── components/ # Astro 和 React 组件├── config/site.ts # 站点名称、导航、页脚、社交链接├── content/posts/ # 按语言组织的博客文章│ ├── en/ # 英文文章│ ├── zh-hans/ # 简体中文文章│ └── .../ # 其他语言├── i18n/ # UI 文本翻译├── layouts/ # 页面布局 (Layout.astro)├── lib/ # 工具函数 (posts, formatter 等)├── pages/ # 路由页面└── styles/global.css # Tailwind v4 主题变量配置
站点配置
编辑 src/config/site.ts——这是整个站点的唯一配置来源。
export const siteConfig = { name: '你的博客名称', title: '你的标语。', description: '你的站点描述,用于 SEO。', author: { name: '你的名字', avatar: '', }, // ...};主要配置项:
| 配置项 | 控制内容 |
|---|---|
name | 导航栏和页脚中的站点标题 |
social | 页脚社交链接(GitHub、X、Discord、邮箱、RSS) |
nav | 导航栏菜单项 |
footer.sections | 页脚栏目链接 |
ui.defaultMode | 默认显示模式:'light'、'dark' 或 'system' |
ui.defaultStyle | 默认风格主题:'default' 或任意内置风格 key |
ui.showMoreThemesMenu | 显示或隐藏 More Themes 自定义主题选择菜单 |
blog.paginationSize | 每页文章数(默认:20) |
sections | 自定义内容分区(见下文) |
环境变量
将 .env.example 复制为 .env 并填入你的值:
cp .env.example .env| 变量名 | 服务 | 必填 |
|---|---|---|
PUBLIC_GA_ID | Google Analytics | 否 |
PUBLIC_CRISP_WEBSITE_ID | Crisp 在线客服 | 否 |
PUBLIC_GISCUS_REPO | Giscus 评论 | 否 |
PUBLIC_GISCUS_REPO_ID | Giscus 评论 | 否 |
PUBLIC_GISCUS_CATEGORY | Giscus 评论 | 否 |
PUBLIC_GISCUS_CATEGORY_ID | Giscus 评论 | 否 |
留空即可禁用对应服务,无需修改代码。
站点 URL
站点 URL 只需在一处配置——astro.config.mjs:
import { defineConfig } from 'astro/config';import aither from '@aither/astro';
export default defineConfig({ site: 'https://your-domain.pages.dev', integrations: [aither()],});所有组件通过 import.meta.env.SITE 读取该值,无需在其他地方重复配置。
写文章
创建文章
在 src/content/posts/en/ 下创建一个新的 .mdx 文件:
---title: 我的第一篇文章date: "2026-03-14T16:00:00+08:00"category: Generaldescription: 用于 SEO 和社交预览的简短摘要。tags: [Topic, Another]pinned: false---
正文从这里开始。使用标准 Markdown 语法。Frontmatter 参考
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
title | string | 是 | — | 文章标题 |
date | date | 是 | — | 发布时间(例如 2026-03-14T16:00:00+08:00) |
category | string | 否 | General | 文章分类 |
description | string | 否 | — | SEO 描述 |
tags | string[] | 否 | — | 标签列表 |
pinned | boolean | 否 | false | 是否置顶 |
image | string | 否 | — | 封面图片路径 |
MDX 组件
所有文章均使用 .mdx 格式,你可以直接在文章中导入和使用 React 组件:
import MyChart from '@/components/MyChart'
这是一个交互式图表:
<MyChart data={[10, 20, 30]} />这是可选的——.mdx 文件中标准 Markdown 语法完全一样可用。
置顶文章
在 frontmatter 中设置 pinned: true。置顶文章会显示在列表顶部并带有置顶图标,置顶文章之间按日期排序。
国际化(i18n)
主题开箱即支持 11 种语言:英语、简体中文、繁体中文、韩语、法语、德语、意大利语、西班牙语、俄语、印度尼西亚语和巴西葡萄牙语。
添加翻译文章
在目标语言目录下创建同名文件:
src/content/posts/en/my-post.mdx # 英文原文src/content/posts/zh-hans/my-post.mdx # 中文翻译src/content/posts/fr/my-post.mdx # 法文翻译每个文件是独立的——frontmatter 字段也需要翻译。
翻译 UI 文本
UI 文本(导航、页脚、按钮)位于 src/i18n/messages/,每种语言有独立的文件:
src/i18n/messages/├── en.ts├── zh-hans.ts├── fr.ts└── ...编辑对应文件即可更改任何 UI 文本。
浏览器语言检测
主题会检测访客的浏览器语言,并显示横幅建议切换语言。用户的偏好保存在 localStorage 中。
自定义内容分区
除了博客文章,你还可以创建自定义内容分区(译文、笔记、教程等),每个分区自动拥有独立的列表页、详情页和导航入口。
添加分区
第 1 步——在 src/content.config.ts 中注册集合:
const translations = defineCollection({ loader: glob({ pattern: '**/*.mdx', base: './src/content/translations' }), schema: contentSchema,});
export const collections = { posts, translations };第 2 步——在 src/config/site.ts 中添加分区配置:
sections: [ { id: 'translations', labelKey: 'translations' },],第 3 步——在 src/i18n/messages/ 的每个语言文件中添加导航标签:
nav: { blog: '博客', translations: '译文', // 添加这一行 about: '关于',},第 4 步——在 src/content/translations/en/ 中创建内容:
---title: 我的翻译date: "2026-03-14T16:00:00+08:00"category: General---
你的翻译内容。列表页(/translations/)、详情页(/translations/slug/)和导航入口会自动为所有 11 种语言生成。
主题定制
模式与风格
主题现在分成两层:
- 显示模式:浅色、深色、系统(跟随操作系统偏好)
- 风格主题:
default或任意内置自定义风格,例如evolution
默认值在 src/config/site.ts 中配置:
ui: { defaultMode: 'system', // 'light' | 'dark' | 'system' defaultStyle: 'default', // 'default' | 自定义风格 key showMoreThemesMenu: true, // true 表示显示自定义主题选择器},选择浅色、深色或系统时,会回到主模式;选择自定义风格时,会保留当前的模式偏好,方便后续切回。主题切换继续使用 View Transitions API,实现平滑的圆形展开动画。
如果你想让主题 UI 更简洁,可以保留模式切换,并把 showMoreThemesMenu 设为 false。这样会隐藏自定义风格列表,但仍保留浅色 / 深色 / 系统三档切换。
主题展示名和主题 key 是分开的:
evolution、threebody这类主题 key 保持稳定,只用于状态和 CSS 选择- 面向用户的主题名称统一集中在
src/config/themes.ts - 本地化时优先翻译通用描述词;品牌名或强 IP 名称可以按目标语言保留一部分原名
这样既能保证代码层稳定,也能让不同语言下的主题命名更自然。
颜色
编辑 src/styles/global.css 中的 CSS 自定义属性。主题使用 Tailwind CSS v4 的 @theme 变量:
:root { --color-link: ...; --color-link-hover: ...; --color-nav-text: ...; /* 等等 */}浅色和深色模式各有一套独立的颜色变量。
字体
主题默认使用系统无衬线字体栈,遵循 Apple Human Interface Guidelines 排版参数(17px / 1.47 / -0.022em)。如需使用自定义字体,请在 Tailwind 主题配置中更新 font-family 值。
SEO 和 AI
每个页面都针对搜索引擎和 AI 智能体进行了优化:
| 功能 | URL | 说明 |
|---|---|---|
| 站点地图 | /sitemap-index.xml | 自动生成 |
| RSS 订阅 | /rss.xml | 自动生成 |
| robots.txt | /robots.txt | 欢迎 AI 爬虫 |
| llms.txt | /llms.txt | AI 内容索引 |
| llms-full.txt | /llms-full.txt | AI 全文内容 |
| Markdown 导出 | /posts/slug.md | 每篇文章的原始 Markdown |
| JSON-LD | 每个页面 | 文章结构化数据 |
| Open Graph | 每个页面 | 社交预览卡片 |
| OG 图片 | /og/slug.png | 通过 Satori 自动生成 |
部署
Cloudflare Pages
最佳实践:先创建 Pages 项目。工作流默认使用仓库名;如果需要覆盖,请设置 CLOUDFLARE_PAGES_PROJECT_NAME。
设置这些 GitHub Secrets:
| Secret | 获取方式 |
|---|---|
CLOUDFLARE_API_TOKEN | Cloudflare 控制台 → API 令牌 |
CLOUDFLARE_ACCOUNT_ID | Cloudflare 控制台 → 账户首页 |
然后运行 pnpm validate,再推送到 main。
自定义域名
在 Cloudflare Pages 控制台的项目设置 → 自定义域名中添加。
技术栈
| 层面 | 技术 |
|---|---|
| 框架 | Astro 6(SSG) |
| UI 岛屿 | React 19 |
| 样式 | Tailwind CSS v4 |
| 组件 | 自定义 Astro 组件 + 少量 React islands |
| 内容 | MDX + Content Collections |
| OG 图片 | Satori + resvg-js |
| 国际化 | 11 种语言 |
| 部署 | Cloudflare Pages |
| 包管理 | pnpm 10 |
| 语言 | TypeScript 5 |
常用命令
| 命令 | 说明 |
|---|---|
pnpm dev | 启动开发服务器(localhost:4321) |
pnpm validate | 运行完整的推送前校验 |
pnpm build | 生产环境构建 |
pnpm preview | 本地预览生产构建 |
版本规则
公开发布的 release tag 使用 CalVer 风格命名,例如 v2026.04.08。
评论