跳到正文
Petrichor's Blog
返回

在 AstroPaper 主题中添加新文章

更新于:

这篇指南介绍在 AstroPaper 中创建新文章时需要了解的规则和约定,包括文件放置位置、frontmatter 字段、图片使用方式和语法高亮配置。

复古木质书桌,上面摆放着书写工具、时钟和皮包

图片来自 Pixabay

目录

目录

创建博客文章

要写一篇新的博客文章,请在 src/content/posts/ 目录中创建一个 Markdown 或 MDX 文件。

你可以用子目录整理文章,让内容更容易管理。子目录名称会成为文章 URL 的一部分。例如,src/content/posts/2025/example-post.md 会生成 /posts/2025/example-post 这个地址。

如果你只是想用子目录做内部整理,不希望它影响 URL,可以在文件夹名称前加下划线(_)。

# 示例:文章文件路径及对应 URL
src/content/posts/very-first-post.md          -> mysite.com/posts/very-first-post
src/content/posts/2025/example-post.md        -> mysite.com/posts/2025/example-post
src/content/posts/_2026/another-post.md       -> mysite.com/posts/another-post
src/content/posts/docs/_legacy/how-to.md      -> mysite.com/posts/docs/how-to
src/content/posts/Example Dir/Dummy Post.md   -> mysite.com/posts/example-dir/dummy-post
Tip

_ 开头的文件和目录会被排除在路由之外。它们适合用于草稿、共享资源或只在内部使用的内容。

Frontmatter(前置元数据)

Frontmatter 是存放博客文章元数据的主要位置。它位于文件顶部,使用 YAML 格式。你可以在 Astro 文档中进一步了解 frontmatter 及其用法。

下面是每篇文章可用的 frontmatter 属性:

属性说明备注
title文章标题,会作为页面的 h1。必填*
description文章描述,会用于文章摘要和当前文章的站点描述。必填*
pubDatetime发布时间,使用 ISO 8601 格式。必填*
modDatetime修改时间,使用 ISO 8601 格式。仅在文章被修改后添加这个属性。可选
author文章作者。默认值 = site.author
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
Tip

你可以在控制台中运行 new Date().toISOString() 来得到 ISO 8601 格式的时间。

Frontmatter 中只有 titledescriptionpubDatetime 是必须指定的字段。

标题和描述(摘要)对搜索引擎优化(SEO)很重要,因此 AstroPaper 建议你在所有博客文章中都填写它们。

如果某篇文章省略了 tags,也就是没有指定任何标签,默认标签 others 会被用于这篇文章。你可以在 src/content.config.ts 中设置默认标签:

// ...
tags: z.array(z.string()).default(["others"]), // 把 "others" 替换成你想要的默认标签
// ...src/content.config.ts

Frontmatter 示例

下面是一篇文章的 frontmatter 示例。

---
title: 文章标题
author: 你的名字
pubDatetime: 2022-09-21T05:17:19Z
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/content/posts/sample-post.md

VS Code 代码片段(可选)

AstroPaper 提供了工作区代码片段,可以加快新文章的创建速度:

这些代码片段位于 .vscode/astro-paper.code-snippets。如果你使用 VS Code 或 Cursor,打开工作区后它们应该会自动可用。

Callouts(提示块)

AstroPaper 从 v6.1 开始支持 callout 提示块。它们使用一种简单的 blockquote 语法,并由 rehype-callouts(Obsidian 主题)提供支持。

下面是最常用的几种类型:

Note

读者需要了解的补充信息。

Tip

有用的建议、快捷方式或最佳实践。

Warning

可能出错或带来意外后果的事项。

Danger

可能导致失败、数据丢失或错误行为的严重风险。

Info

中性的背景信息,紧急程度低于 note。

Success

表示某件事已经成功或是正确的确认信息。

完整支持的类型包括:NOTEABSTRACTINFOTODOTIPSUCCESSQUESTIONWARNINGFAILUREDANGERBUGEXAMPLEQUOTE。每种类型都有自己的图标和颜色。许多类型也支持别名,例如 HINTIMPORTANT 可作为 TIP 使用,CAUTION 可作为 WARNING 使用。完整参考请查看 rehype-callouts 文档

可折叠提示块

在类型后加 - 可以让提示块默认折叠;加 + 可以让提示块默认展开,但仍然可以折叠:

继续之前请阅读

这段内容会在读者展开前保持隐藏。它适合放置较长的注意事项,避免打断正文阅读节奏。

进阶提示(默认展开)

这个提示块会默认打开,但可以被折叠。适合放置你希望读者一开始就能看到的可选细节。

自定义标题

如果你想替换默认的类型标签,可以在类型后添加任意标题:

你知道吗?

类型后面的文本会成为 callout 的标题。如果省略它,就会自动使用类型名称。

语法速览

> [!NOTE]
> 补充信息。

> [!WARNING]- 默认折叠
> 展开前保持隐藏。

> [!TIP]+ 默认展开,但可以折叠
> 初始状态为打开。

> [!DANGER] 自定义标题
> 替换默认标题。

添加目录

默认情况下,文章不会包含目录(TOC)。如果要添加目录,请把 目录 写成 h2 标题(Markdown 中的 ##),并放在你希望目录出现的位置:

---
# frontmatter
---

这里是一些在 AstroPaper 博客主题中创建新文章时可参考的建议、技巧和注意事项。

## 目录

<!-- 文章的其余内容 -->

标题层级

关于标题有一点需要注意。AstroPaper 会把 frontmatter 中的 title 作为文章的主标题。因此,正文中的其它标题应该从 h2h6 开始使用。

这条规则不是强制性的,但从视觉层级、可访问性和 SEO 的角度来看都强烈推荐。

语法高亮

AstroPaper 默认使用 Shiki 作为语法高亮工具,并通过 @shikijs/transformers 增强 fenced code block。如果你不想使用这些 transformers,可以将它们移除:

pnpm remove @shikijs/transformers
// ...
import {
  transformerNotationDiff,
  transformerNotationHighlight,
  transformerNotationWordHighlight,
} from "@shikijs/transformers";

const tocHeading = "目录|(table[ -]of[ -])?contents?|toc";
const tocHeadingPattern = /^(目录|(table[ -]of[ -])?contents?|toc)$/i;

export default defineConfig({
  // ...
  markdown: {
    processor: unified({
      remarkPlugins: [
        [remarkToc, { heading: tocHeading }],
        [remarkCollapse, { test: tocHeadingPattern }],
      ],
    }),
    shikiConfig: {
      themes: { light: "min-light", dark: "min-dark" },
      defaultColor: false,
      wrap: false,
      transformers: [
        transformerFileName(),
        transformerNotationHighlight(),
        transformerNotationWordHighlight(),
        transformerNotationDiff({ matchAlgorithm: "v3" }),
      ],
    },
  },
  // ...
});astro.config.ts

存放博客内容图片

在 Markdown 文件中存放和使用图片,常见有两种方式。

Important

如果你需要在 Markdown 中为优化后的图片添加样式,应该使用 MDX

放在 src/assets/ 目录中(推荐)

你可以把图片存放在 src/assets/ 目录中。Astro 会通过 Image Service API 自动优化这些图片。

你可以使用相对路径或别名路径(@/assets/)引用这些图片。

示例:假设你想展示 example.jpg,它的路径是 src/assets/images/example.jpg

![something](@/assets/images/example.jpg)

<!-- 或者 -->

![something](../../assets/images/example.jpg)

<!-- 在 markdown 中使用 img 标签或 Image 组件不会生效 ❌ -->
<img src="@/assets/images/example.jpg" alt="something">
<!-- ^^ 这是错误写法 -->
Tip

从技术上说,你可以把图片存放在 src 下的任意目录中。src/assets 只是推荐做法。

放在 public/ 目录中

你也可以把图片存放在 public/ 目录中。需要注意的是,存放在 public/ 中的图片不会被 Astro 处理,也就意味着它们不会被自动优化,你需要自己处理图片优化。

对于这些图片,请使用绝对路径。它们可以通过 Markdown 图片语法或 HTML img 标签展示。

示例:假设 example.jpg 位于 public/assets/images/example.jpg

![something](/assets/images/example.jpg)

<!-- 或者 -->

<img src="/assets/images/example.jpg" alt="something">

补充说明

图片压缩

Warning

把图片放进博客文章前,特别是放进 public/ 目录前,应该先压缩图片。未优化的图片会明显影响页面性能。

推荐的图片压缩网站:

OG 图片

如果文章没有指定 OG 图片,会使用默认 OG 图片。虽然 OG 图片不是必填项,但建议在 frontmatter 中指定一张与文章相关的 OG 图片。推荐的 OG 图片尺寸是 1200 X 640 px。

Tip

从 AstroPaper v1.4.0 开始,如果没有指定 OG 图片,会自动生成。你可以查看这篇公告了解更多。


分享这篇文章:

上一篇
WSL2 中为 WSLg 启用 GPU 硬件加速