Grove 主题配置与使用指南
这个网站所用主题的完整说明:站点配置、各类内容的 frontmatter、分类图标与颜色、系列说明,以及 Markdown 扩展写法和效果。
这篇是 Grove 主题的使用手册,写给以后的自己,也写给想用这个主题的人。所有配置都在两个地方:site.config.ts 管站点,src/content/ 下的 Markdown 管内容。改主题本身的代码不是必须的,下面提到的定制都能在这两处完成,以后更新主题也不会和你的改动冲突。
先跑起来
需要 Node 22.12 以上和 pnpm。
pnpm install
pnpm setup:config # 从 site/site.config.ts.example 生成本地配置,已有文件时保留原样
pnpm dev # 本地预览 http://localhost:4321
pnpm check # 类型检查
pnpm build # 构建到 site/dist新建内容用脚本,文件名就是网址,只用小写英文、数字和连字符,发布后不要再改:
pnpm new writing my-first-post 我的第一篇文章
pnpm new note
pnpm new project tiny-focus 番茄钟新文章默认是草稿(draft: true),只在 pnpm dev 里能看到,构建时不会输出。
站点配置
在本仓库中,site/site.config.ts.example 是随代码维护的配置示例,site/site.config.ts 是 Git 忽略的本地配置。首次运行 pnpm setup:config 生成,再修改自己的信息;重复运行不会覆盖已有配置。旧版用户首次迁移前先把配置备份到仓库外,更新后放回。实际部署时也需要在构建环境提供自己的配置文件。
site.config.ts 的可选项有默认值,可选的展示项留空就不显示。下面是一份常用项都写上的例子:
import { defineConfig } from 'astro-theme-grove/config';
export default defineConfig({
title: '网站名称', // 页头左上角、浏览器标题、分享卡片
tagline: '写代码,也写生活',
description: '一句话介绍这个网站,也是首页的搜索摘要。',
locale: 'zh-CN',
timezone: 'Asia/Shanghai',
since: 2024,
author: {
name: '你的名字', // 站长名字,可以和网站名称不同
jobTitle: '全栈开发者',
location: '上海',
email: 'hello@example.com',
avatar: '/avatar.jpg', // 放在 public/ 下
},
// 首页开场:问候 + 介绍,段落之间空一行;{name} 会换成 author.name
hero: {
title: '你好,我是{name}。',
intro: `第一段是导语。
第二段是补充说明。`,
},
// 首页“找到我”:handle 是显示在右边的文字,不填显示去掉协议的网址
social: [
{ label: 'GitHub', href: 'https://github.com/your-name', handle: '@your-name' },
{ label: '掘金', href: 'https://juejin.cn/user/your-id', handle: '你的名字' },
{ label: 'RSS', href: '/rss.xml', handle: '订阅全文' },
],
// 首页开场顶部的公告,不需要时整段删掉
sidebar: {
announcement: { body: '网站正在继续打磨。', link: { label: '更新记录', href: '/notes/' } },
},
footer: {
beian: {
icp: '京ICP备12345678号-1',
police: '京公网安备11010502030143号',
},
},
});title 是网站名称,author.name 是你自己的名字,两者可以不一样。首页问候语、介绍和关于页的 title、description 里写 {name},会自动换成 author.name,以后改名只需要改一处。不写 hero.title 时,首页默认显示 你好,我是{name}。。
其余常用项:
| 配置 | 作用 |
|---|---|
nav | 自定义顶部导航,默认 首页 / 文章 / 作品 / 笔记 / 关于 |
writing.homeCount、projects.homeCount、notes.homeCount | 首页各展示几条 |
notes.pageSize | 笔记每页条数 |
seo.ogImage、seo.verification | 默认分享图、各搜索引擎站长平台验证码 |
comments.giscus | 开启 giscus 评论 |
analytics | 百度统计、Google Analytics、Umami,填了才加载 |
rss.fullText、rss.includeNotes | RSS 输出全文、是否包含笔记 |
fonts.cjkSerif | system 时不加载思源宋体网络字体 |
customCss | 追加自己的样式文件,用来改设计变量 |
站点的正式域名写在 astro.config.mjs 的 site 里,canonical、sitemap 和 RSS 都靠它生成绝对地址。
写内容
文章
---
title: 文章标题
description: 搜索结果和列表里显示的摘要,50–150 字
pubDate: 2026-10-15
updatedDate: 2026-10-20 # 有实质修改时填
category: tutorial # 必须是 writing.categories 里的 id
tags: [Astro, 个人网站]
series: Grove主题系列 # 同名文章自动串成系列
project: astro-theme-grove # 所属作品,见下文
cover: ./cover.jpg # 可选,建议 16:10;不填用生成封面
coverAlt: 封面的文字说明
featured: true # 文章页头条优先用它
---不想要二级标题编号就写 numbered: false,不要目录写 toc: false,转载的文章用 canonical 指向原文。
文章和作品互相关联
在文章里写 project: 作品文件名,两边会自动出现:
- 文章开头显示所属作品的卡片;
- 作品页的“相关文章”收录这篇,超过 2 篇时只先显示最新 2 篇,其余放进“查看更多”。
id 写错会让构建失败,并列出所有可用的作品 id,不会悄悄丢掉关联。笔记也支持 project,会出现在作品页的“开发笔记”里。
作品、笔记与关于页
---
title: Tiny Focus
description: 一句话介绍
type: experiment # 必须是 projects.types 里的 id
status: maintained # active / maintained / paused / archived / idea
startDate: 2025-03-01
endDate: 2025-04-20 # 进行中就不写
tech: [TypeScript, Web Audio, PWA]
repo: https://github.com/you/tiny-focus
demo: https://example.com/tiny-focus
featured: true
---作品没有封面时,生成封面中间放的是 tech 里前 3 个能识别的技术 Logo。
笔记的 pubDate 最好带时区,比如 2026-10-15T21:30:00+08:00,列表里会显示到分钟。
关于页的“我会的”可以标熟悉程度:
skills:
- group: 后端
items:
- { name: Java, level: expert } # 精通
- { name: MySQL, level: proficient } # 熟练
- { name: Redis, level: familiar } # 了解
- Go # 不写程度也行技术名称会自动匹配品牌 Logo(忽略大小写和符号,Node.js、Tailwind CSS 都能认出来)。认不出来时显示通用的代码图标,这时可以用 icon 自己指定,写法和下面“分类的图标”完全一样:
- { name: Vue3, level: expert, icon: 'brand:vuedotjs' } # 品牌图标
- { name: 部署, level: familiar, icon: globe } # 内置图标
- { name: 自研工具, icon: ./src/icons/tool.svg } # SVG 文件icon 写错时构建会失败,并指出是第几组第几项、错在哪里。
分类的图标
文章分类、作品类型、笔记类型都可以设置图标,用在生成封面的中间。图标直接写在配置里,不用改主题文件。
四种写法
writing: {
categories: [
// 1. 内置图标名,见下面的一览
{ id: 'tutorial', label: '技术教程', icon: 'code' },
// 2. 品牌图标:brand: 加 simple-icons 的 slug
{ id: 'python', label: 'Python', icon: 'brand:python' },
// 3. 直接粘贴 SVG
{ id: 'reading', label: '读书笔记', icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/></svg>' },
// 4. 站点里的 SVG 文件,路径相对站点根目录
{ id: 'essay', label: '随笔', icon: './src/icons/feather.svg' },
],
},内置图标一览
名字下面的文字就是 icon 要填的值:
menuclosemailrsslinkcalendarclockfilehashpinbriefcasegraduationcodeglobetaglayerspensparkbookuserbulbflaskarrow-rightarrow-leftarrow-up-rightarrow-upcopycheckchevronexpand从外部找图标
推荐 Lucide:它的图标和内置的这套是同一种风格(24×24、线性、圆头),放在一起不会突兀。找到图标后点 Copy SVG,粘贴到 icon 里,或者保存成 .svg 文件填路径。
品牌图标的 slug 在 simpleicons.org 查,一般就是小写的品牌名,比如 brand:docker、brand:rust。
写错会怎样
启动开发服务器或构建时,主题会逐个检查图标。只要有一个无效就停下来,告诉你是哪一项、为什么:
[astro-theme-grove] site.config.ts 里的图标有误:
- writing.categories[0](技术教程).icon:没有名为 “books” 的内置图标。可用:……
- writing.categories[1](深度思考).icon:找不到品牌图标 “notexist”……
- writing.categories[2](随笔).icon:找不到文件 ./src/icons/missing.svg……分类的颜色
不设置时,分类和类型按配置顺序从这 8 种颜色里循环取,深色模式下自动换成对应的浅色版本:
--tone-1--tone-2--tone-3--tone-4--tone-5--tone-6--tone-7--tone-8想自己指定,就写 color:
// 只写一个颜色
{ id: 'tutorial', label: '技术教程', icon: 'code', color: '#2d7470' },
// 浅色、深色分别指定
{
id: 'essay',
label: '随笔',
icon: 'pen',
color: { light: '#a24a65', dark: '#f0b8c8' },
},只写一个颜色时,深色模式会自动提亮;对效果不满意再用 { light, dark } 分别指定。颜色会同时用在分类文字和生成封面上。颜色必须是 16 进制(#2d7470 或 #27a),写错同样会在启动时报错。
系列说明
系列由文章的 series 字段自动组成。想给系列写一段说明,加在配置里,name 和文章里写的保持一致:
writing: {
series: [{ name: 'Grove主题系列', description: 'Grove 主题的配置、使用与更新记录' }],
},说明会显示在系列页标题下、系列卡片里,也作为搜索摘要。没写说明的系列什么都不显示。
Markdown 扩展
提示块
> [!NOTE]
> 补充说明。
> [!TIP] 可以自定义标题
> 一个小技巧。五种效果:
在 MDX 文件里也可以用组件写:<Callout kind="tip" title="标题">内容</Callout>。
代码块
在语言后面加 title 显示文件名,加花括号高亮行,nolines 关掉行号:
```ts title="src/demo.ts" {2,4-5}
const a = 1;
const b = 2; // 高亮
const c = 3;
const d = 4; // 高亮
const e = 5; // 高亮
```效果:
const a = 1;
const b = 2; // 高亮
const c = 3;
const d = 4; // 高亮
const e = 5; // 高亮pnpm build每个代码块都带复制按钮,超过 24 行自动折叠。
图片说明、表格与脚注
图片的标题会变成图片下方的说明文字:
表格在窄屏上会横向滚动,不会撑破页面:
| 写法 | 效果 |
|---|---|
**粗体** | 粗体 |
*斜体* | 斜体 |
`代码` | 代码 |
[链接](https://astro.build) | 链接 |
外部链接会自动在新标签页打开。脚注写成这样1,内容放在文末统一列出。
改外观
主题的颜色、字号、宽度都是 CSS 变量。新建一个样式文件,在配置里用 customCss 引入,只改变量就行:
:root { --accent: #2f6f62; --accent-soft: #e1efeb; }
[data-theme='dark'] { --accent: #9fd3c4; --accent-soft: #233a35; }customCss: ['./src/styles/custom.css'],--accent 是全站的强调色,返回链接、“查看全部”、当前页标记都用它。
脚注
-
脚注的内容,点击编号可以跳回正文。 ↩