以下是使用 AstroPaper 博客主题创建新文章的一些规则/建议、技巧与诀窍。

目录
创建博客文章
要撰写新的博客文章,请在 src/data/blog/ 目录下创建一个 markdown 文件。
在 AstroPaper v5.1.0 之前,所有博客文章都必须放在
src/data/blog/中,意味着你不能将它们组织到子目录中。
从 AstroPaper v5.1.0 开始,你现在可以将博客文章组织到子目录中,从而更方便地管理内容。
例如,如果你想把文章按 2025 分组,可以将它们放在 src/data/blog/2025/ 中。这也会影响文章 URL,因此 src/data/blog/2025/example-post.md 可以通过 /posts/2025/example-post 访问。
如果你不希望子目录影响文章 URL,只需在文件夹名称前加上下划线 _。
# 示例:博客文章结构与 URL
src/data/blog/very-first-post.md -> mysite.com/posts/very-first-post
src/data/blog/2025/example-post.md -> mysite.com/posts/2025/example-post
src/data/blog/_2026/another-post.md -> mysite.com/posts/another-post
src/data/blog/docs/_legacy/how-to.md -> mysite.com/posts/docs/how-to
src/data/blog/Example Dir/Dummy Post.md -> mysite.com/posts/example-dir/dummy-post
💡 提示:你也可以在前置元数据中覆盖博客文章的 slug。详见下一节。
如果子目录 URL 没有出现在构建输出中,请删除 node_modules,重新安装依赖,然后重新构建。
前置元数据
前置元数据是存储博客文章(文章)重要信息的主要位置。前置元数据位于文章顶部,以 YAML 格式编写。了解更多关于前置元数据及其用法的信息,请参阅 astro 文档。
以下是每篇文章的前置元数据属性列表。
| 属性 | 描述 | 备注 |
|---|---|---|
| title | 文章标题 (h1) | 必填* |
| description | 文章描述。用于文章摘要和站点描述。 | 必填* |
| pubDatetime | ISO 8601 格式的发布时间。 | 必填* |
| modDatetime | ISO 8601 格式的修改时间。(仅在文章修改时添加此属性) | 可选 |
| author | 文章作者。 | 默认 = SITE.author |
| slug | 文章的 slug。此字段可选。 | 默认 = 基于文件名的 slug |
| featured | 是否在首页的精选区域显示此文章。 | 默认 = false |
| draft | 将此文章标记为”未发布”。 | 默认 = false |
| tags | 文章的相关关键词。以 YAML 数组格式书写。 | 默认 = others |
| ogImage | 文章的 OG 图片。用于社交媒体分享和 SEO。可以是远程 URL 或相对当前文件夹的图片路径。 | 默认 = SITE.ogImage 或生成的 OG 图片 |
| canonicalURL | 规范 URL(绝对地址),用于文章已存在于其他来源时。 | 默认 = Astro.site + Astro.url.pathname |
| hideEditPost | 隐藏博客标题下方的编辑文章按钮。仅对当前博客文章生效。 | 默认 = false |
| timezone | 为当前博客文章指定 IANA 格式的时区。这将覆盖当前文章的 SITE.timezone 配置。 | 默认 = SITE.timezone |
提示!你可以在控制台中运行
new Date().toISOString()来获取 ISO 8601 格式的日期时间。记得去掉引号。
前置元数据中只有 title、description 和 pubDatetime 字段是必须指定的。
标题和描述(摘要)对搜索引擎优化(SEO)很重要,因此 AstroPaper 建议在博客文章中包含这些内容。
slug 是 URL 的唯一标识符。因此,slug 必须是唯一的,且与其他文章不同。slug 中的空白应使用 - 或 _ 分隔,但建议使用 -。Slug 会根据博客文章的文件名自动生成。但你也可以在博客文章的前置元数据中定义自己的 slug。
例如,如果博客文件名是 adding-new-post.md 且你未在前置元数据中指定 slug,Astro 会自动根据文件名创建 slug。因此 slug 将是 adding-new-post。但如果你在前置元数据中指定了 slug,它将覆盖默认的 slug。你可以在 Astro 文档中了解更多相关信息。
如果你在博客文章中省略了 tags(换句话说,如果没有指定标签),该文章将使用默认标签 others。你可以在 content.config.ts 文件中设置默认标签。
export const blogSchema = z.object({
// ...
draft: z.boolean().optional(),
tags: z.array(z.string()).default(["others"]), // 将 "others" 替换为你想要的默认标签
// ...
});src/content.config.ts
前置元数据示例
以下是文章的前置元数据示例。
---
title: 文章标题
author: 你的名字
pubDatetime: 2022-09-21T05:17:19Z
slug: 文章-slug
featured: true
draft: false
tags:
- 某些
- 示例
- 标签
ogImage: ../../assets/images/example.png # src/assets/images/example.png
# ogImage: "https://example.org/remote-image.png" # 远程 URL
description: 这是示例文章的示例描述。
canonicalURL: https://example.org/my-article-was-already-posted-here
---src/data/blog/sample-post.md
添加目录
默认情况下,文章不包含目录。要包含目录,你需要以特定方式指定。
以 h2 格式(Markdown 中的 ##)编写 Table of contents,并将其放置在你希望目录出现的位置。
例如,如果你想将目录放在介绍段落下方(就像我通常做的那样),可以按以下方式操作。
---
# 前置元数据
---
以下是使用 AstroPaper 博客主题创建新文章的一些建议、技巧与诀窍。
## Table of contents
<!-- 文章的其余内容 -->
标题
关于标题有一点需要注意。AstroPaper 博客文章使用标题(前置元数据中的 title)作为文章的主标题。因此,文章中的其余标题应使用 h2 ~ h6。
这条规则不是强制性的,但出于视觉、可访问性和 SEO 的考虑,强烈建议遵守。
语法高亮
AstroPaper 使用 Shiki 作为默认的语法高亮工具。从 AstroPaper v5.4 开始,使用 @shikijs/transformers 来增强围栏代码块的功能。如果你不想使用它,可以按如下方式移除:
pnpm remove @shikijs/transformers
// ...
import {
transformerNotationDiff,
transformerNotationHighlight,
transformerNotationWordHighlight,
} from "@shikijs/transformers";
export default defineConfig({
// ...
markdown: {
remarkPlugins: [remarkToc, [remarkCollapse, { test: "Table of contents" }]],
shikiConfig: {
// 更多主题请访问 https://shiki.style/themes
themes: { light: "min-light", dark: "night-owl" },
defaultColor: false,
wrap: false,
transformers: [
transformerFileName(),
transformerNotationHighlight(),
transformerNotationWordHighlight(),
transformerNotationDiff({ matchAlgorithm: "v3" }),
],
},
},
// ...
}astro.config.ts
存储博客内容中的图片
以下是两种在 markdown 文件中存储和显示图片的方法。
注意!如果你需要在 markdown 中对优化图片进行样式设置,应使用 MDX。
存储在 src/assets/ 目录中(推荐)
你可以将图片存储在 src/assets/ 目录中。这些图片将通过 Astro 的图片服务 API 自动优化。
你可以使用相对路径或别名路径(@/assets/)来引用这些图片。
示例:假设你想显示路径为 /src/assets/images/example.jpg 的 example.jpg。

<!-- 或 -->

<!-- 使用 img 标签或 Image 组件将无法正常工作 ❌ -->
<img src="@/assets/images/example.jpg" alt="图片描述">
<!-- ^^ 这是错误的 -->
从技术上讲,你可以将图片存储在
src下的任何目录中。这里推荐src/assets只是建议。
存储在 public 目录中
你可以将图片存储在 public 目录中。请记住,存储在 public 目录中的图片不会被 Astro 处理,意味着它们不会被优化,你需要自己处理图片优化。
对于这些图片,你应使用绝对路径;这些图片可以使用 Markdown 注释或 HTML img 标签来显示。
示例:假设 example.jpg 位于 /public/assets/images/example.jpg。

<!-- 或 -->
<img src="/assets/images/example.jpg" alt="图片描述">
额外内容
图片压缩
当你在博客文章中放置图片时(尤其是 public 目录下的图片),建议对图片进行压缩。这会影响网站的整体性能。
我推荐的图片压缩网站:
OG 图片
如果文章未指定 OG 图片,将使用默认的 OG 图片。虽然不是必须的,但建议在前置元数据中指定与文章相关的 OG 图片。OG 图片的推荐尺寸为 1200 × 640 像素。
从 AstroPaper v1.4.0 开始,如果未指定 OG 图片,将自动生成。请查看相关公告。