跳到正文

文章

Grove 主题配置与使用指南

这个网站所用主题的完整说明:站点配置、各类内容的 frontmatter、分类图标与颜色、系列说明,以及 Markdown 扩展写法和效果。

目录
  1. 先跑起来
  2. 站点配置
  3. 写内容
  4. 分类的图标
  5. 分类的颜色
  6. 系列说明
  7. Markdown 扩展
  8. 改外观

这篇是 Grove 主题的使用手册,写给以后的自己,也写给想用这个主题的人。所有配置都在两个地方:site.config.ts 管站点,src/content/ 下的 Markdown 管内容。改主题本身的代码不是必须的,下面提到的定制都能在这两处完成,以后更新主题也不会和你的改动冲突。

先跑起来

需要 Node 22.12 以上和 pnpm。

bash
pnpm install
pnpm setup:config # 从 site/site.config.ts.example 生成本地配置,已有文件时保留原样
pnpm dev          # 本地预览 http://localhost:4321
pnpm check        # 类型检查
pnpm build        # 构建到 site/dist

新建内容用脚本,文件名就是网址,只用小写英文、数字和连字符,发布后不要再改:

bash
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 的可选项有默认值,可选的展示项留空就不显示。下面是一份常用项都写上的例子:

site/site.config.tsts
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.includeNotesRSS 输出全文、是否包含笔记
fonts.cjkSerifsystem 时不加载思源宋体网络字体
customCss追加自己的样式文件,用来改设计变量

站点的正式域名写在 astro.config.mjs 的 site 里,canonical、sitemap 和 RSS 都靠它生成绝对地址。

写内容

文章

src/content/writing/my-post.mdyaml
---
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,会出现在作品页的“开发笔记”里。

作品、笔记与关于页

src/content/projects/tiny-focus.mdyaml
---
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,列表里会显示到分钟。

关于页的“我会的”可以标熟悉程度:

src/content/pages/about.mdyaml
skills:
  - group: 后端
    items:
      - { name: Java, level: expert }       # 精通
      - { name: MySQL, level: proficient }  # 熟练
      - { name: Redis, level: familiar }    # 了解
      - Go                                  # 不写程度也行

技术名称会自动匹配品牌 Logo(忽略大小写和符号,Node.js、Tailwind CSS 都能认出来)。认不出来时显示通用的代码图标,这时可以用 icon 自己指定,写法和下面“分类的图标”完全一样:

yaml
      - { name: Vue3, level: expert, icon: 'brand:vuedotjs' }   # 品牌图标
      - { name: 部署, level: familiar, icon: globe }             # 内置图标
      - { name: 自研工具, icon: ./src/icons/tool.svg }            # SVG 文件

icon 写错时构建会失败,并指出是第几组第几项、错在哪里。

分类的图标

文章分类、作品类型、笔记类型都可以设置图标,用在生成封面的中间。图标直接写在配置里,不用改主题文件。

四种写法

site/site.config.tsts
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 要填的值:

从外部找图标

推荐 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 种颜色里循环取,深色模式下自动换成对应的浅色版本:

1 · 蓝--tone-1
2 · 紫--tone-2
3 · 绿--tone-3
4 · 橙--tone-4
5 · 青--tone-5
6 · 玫瑰--tone-6
7 · 橄榄--tone-7
8 · 靛--tone-8

想自己指定,就写 color:

ts
// 只写一个颜色
{ id: 'tutorial', label: '技术教程', icon: 'code', color: '#2d7470' },
// 浅色、深色分别指定
{
  id: 'essay',
  label: '随笔',
  icon: 'pen',
  color: { light: '#a24a65', dark: '#f0b8c8' },
},

只写一个颜色时,深色模式会自动提亮;对效果不满意再用 { light, dark } 分别指定。颜色会同时用在分类文字和生成封面上。颜色必须是 16 进制(#2d7470 或 #27a),写错同样会在启动时报错。

系列说明

系列由文章的 series 字段自动组成。想给系列写一段说明,加在配置里,name 和文章里写的保持一致:

ts
writing: {
  series: [{ name: 'Grove主题系列', description: 'Grove 主题的配置、使用与更新记录' }],
},

说明会显示在系列页标题下、系列卡片里,也作为搜索摘要。没写说明的系列什么都不显示。

Markdown 扩展

提示块

md
> [!NOTE]
> 补充说明。

> [!TIP] 可以自定义标题
> 一个小技巧。

五种效果:

在 MDX 文件里也可以用组件写:<Callout kind="tip" title="标题">内容</Callout>。

代码块

在语言后面加 title 显示文件名,加花括号高亮行,nolines 关掉行号:

md
```ts title="src/demo.ts" {2,4-5}
const a = 1;
const b = 2; // 高亮
const c = 3;
const d = 4; // 高亮
const e = 5; // 高亮
```

效果:

src/demo.tsts
const a = 1;
const b = 2; // 高亮
const c = 3;
const d = 4; // 高亮
const e = 5; // 高亮
bash
pnpm build

每个代码块都带复制按钮,超过 24 行自动折叠。

图片说明、表格与脚注

图片的标题会变成图片下方的说明文字:

md
![替代文字](./image.png "这句话显示在图片下方")

表格在窄屏上会横向滚动,不会撑破页面:

写法效果
**粗体**粗体
*斜体*斜体
`代码`代码
[链接](https://astro.build)链接

外部链接会自动在新标签页打开。脚注写成这样1,内容放在文末统一列出。

改外观

主题的颜色、字号、宽度都是 CSS 变量。新建一个样式文件,在配置里用 customCss 引入,只改变量就行:

src/styles/custom.csscss
:root { --accent: #2f6f62; --accent-soft: #e1efeb; }
[data-theme='dark'] { --accent: #9fd3c4; --accent-soft: #233a35; }
ts
customCss: ['./src/styles/custom.css'],

--accent 是全站的强调色,返回链接、“查看全部”、当前页标记都用它。

脚注

  1. 脚注的内容,点击编号可以跳回正文。 ↩

外观

字号17
主题
正文字体
行距
栏宽