教程 #指南#Astro

Astro-Theme-Aither 使用指南

2026-03-14 · 1598 字 · 8 分钟

安装、配置、自定义和部署 Astro-Theme-Aither 所需的一切,都在这一篇文章里。

本指南涵盖从零开始到完成部署多语言博客的全部内容。你可以从头读到尾,也可以直接跳到需要的章节。

前置条件

  • Node.js 22 LTS 或更高版本
  • pnpm 10 或更高版本
  • 一个 GitHub 账号
  • 一个 Cloudflare 账号(用于部署)

安装

Terminal windowBash
git clone https://github.com/YOUR_USERNAME/YOUR_REPO.git
cd YOUR_REPO
corepack enable
pnpm install
pnpm validate
pnpm 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 并填入你的值:

Terminal windowBash
cp .env.example .env
变量名服务必填
PUBLIC_GA_IDGoogle Analytics
PUBLIC_CRISP_WEBSITE_IDCrisp 在线客服
PUBLIC_GISCUS_REPOGiscus 评论
PUBLIC_GISCUS_REPO_IDGiscus 评论
PUBLIC_GISCUS_CATEGORYGiscus 评论
PUBLIC_GISCUS_CATEGORY_IDGiscus 评论

留空即可禁用对应服务,无需修改代码。

站点 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: General
description: 用于 SEO 和社交预览的简短摘要。
tags: [Topic, Another]
pinned: false
---
正文从这里开始。使用标准 Markdown 语法。

Frontmatter 参考

字段类型必填默认值说明
titlestring文章标题
datedate发布时间(例如 2026-03-14T16:00:00+08:00
categorystringGeneral文章分类
descriptionstringSEO 描述
tagsstring[]标签列表
pinnedbooleanfalse是否置顶
imagestring封面图片路径

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 是分开的:

  • evolutionthreebody 这类主题 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.txtAI 内容索引
llms-full.txt/llms-full.txtAI 全文内容
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_TOKENCloudflare 控制台 → API 令牌
CLOUDFLARE_ACCOUNT_IDCloudflare 控制台 → 账户首页

然后运行 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

全文完 · 谢谢阅读

评论