跳到主要内容
招文桃
返回

在 AstroPaper 主题中添加文章

更新于:

本文介绍在 AstroPaper 中创建文章的规则与约定 —— 文件放置、frontmatter 字段、图片以及代码高亮。

经典木质书桌,摆放着书写工具、复古时钟和一只皮包

摄影: Pixabay

目录

Open 目录

创建一个博客文章

要写一篇新博客文章,在 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 格式写在文件顶部。关于 frontmatter 及其用法,可参阅 Astro 官方文档

下面是每篇文章可用的 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规范链接(绝对地址),适用于文章已发布在其他来源的情况默认 = 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:
  - some
  - example
  - tags
ogImage: ../../assets/images/example.png # src/assets/images/example.png
# ogImage: "https://example.org/remote-image.png" # remote 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 开始支持提示框。它基于 rehype-callouts(Obsidian 主题),使用简单的引用块语法。

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

Note

读者需要知道的补充信息。

Tip

有帮助的建议、捷径或最佳实践。

Warning

可能出错或产生意外后果的地方。

Danger

存在失败、数据丢失或行为错误的严重风险。

Info

中性的背景信息 —— 紧要程度低于 NOTE。

Success

确认某件事已生效或正确。

完整的类型列表包括:NOTEABSTRACTINFOTODOTIPSUCCESSQUESTIONWARNINGFAILUREDANGERBUGEXAMPLEQUOTE —— 每种都有各自的图标和配色。不少类型还支持别名(例如 HINTIMPORTANT 等价于 TIPCAUTION 等价于 WARNING)。完整说明见 rehype-callouts 文档

可折叠的提示框

在类型后加 - 表示默认折叠,加 + 表示默认展开但可折叠:

继续之前请先阅读

这段内容在读者展开前是隐藏的。适合放那些篇幅较长、直接写出来会打断阅读节奏的注意事项。

进阶技巧(默认展开)

这段一开始是展开的,但可以折叠起来。适合那些可选、但希望首屏就能看到的细节。

自定义标题

在类型后面写上文字,就能把默认的类型标签替换成你想要的标题:

你知道吗?

类型后面的文字会成为提示框的标题。不写的话就自动使用类型名。

语法速查

> [!NOTE]
> 补充信息。

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

> [!TIP]+ 默认展开,但可折叠
> 一开始是打开的。

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

添加目录

默认情况下文章不带目录。想要目录的话,在你希望它出现的位置写一个 h2 标题(Markdown 中的 ##),内容为「目录」(英文 Table of contents 同样有效):

---
# frontmatter
---

这里是在 AstroPaper 博客主题中新建文章的一些建议与技巧。

## 目录

<!-- 文章的其余部分 -->

标题层级

关于标题有一点需要注意:AstroPaper 会把 frontmatter 中的 title 作为文章的主标题,因此正文里的其余标题应当从 h2 ~ h6 中选用。

这不是硬性规定,但出于视觉呈现、无障碍访问和 SEO 的考虑,强烈建议遵守。

代码高亮

AstroPaper 默认使用 Shiki 做代码高亮,并配合 @shikijs/transformers 增强围栏代码块的能力。如果你不需要这些 transformer,可以移除:

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

export default defineConfig({
  // ...
  markdown: {
    remarkPlugins: [remarkToc, [remarkCollapse, { test: "Table of contents" }]],
    shikiConfig: {
      themes: { light: "min-light", dark: "night-owl" },
      defaultColor: false,
      wrap: false,
      transformers: [
        transformerFileName(),
        transformerNotationHighlight(),
        transformerNotationWordHighlight(),
        transformerNotationDiff({ matchAlgorithm: "v3" }),
      ],
    },
  },
  // ...
});astro.config.ts

博客图片的存放

下面是两种存放图片并在 markdown 中引用它们的方式。

Important

如果需要给经过优化的图片加样式,应当改用 MDX

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

图片可以放在 src/assets/ 目录中,Astro 会通过 Image Service API 自动优化它们。

引用时可以用相对路径,也可以用别名路径(@/assets/)。

示例:假设要显示 example.jpg,其路径为 src/assets/images/example.jpg

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

<!-- OR -->

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

<!-- 在 markdown 里用 img 标签或 Image 组件是无效的 ❌ -->
<img src="@/assets/images/example.jpg" alt="something">
<!-- ^^ 这样写是错的 -->
Tip

严格来说,图片放在 src 下的任何目录都可以,src/assets 只是推荐做法。

放在 public/ 目录下

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

这类图片要用绝对路径引用,可以使用 markdown 图片语法或 HTML 的 img 标签。

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

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

<!-- OR -->

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

附加建议

图片压缩

Warning

往文章里放图片前(尤其是放进 public/ 目录的),先压缩一下。未经优化的图片会明显拖累页面性能。

推荐的图片压缩站点:

OG 图

文章没有指定 OG 图时会使用默认图。虽然不是必填,但仍建议在 frontmatter 中指定一张与文章内容相关的 OG 图。推荐尺寸为 1200 x 640 像素。

Tip

从 AstroPaper v1.4.0 起,未指定 OG 图时会自动生成。详见发布说明


分享这篇文章:

上一篇
如何配置 AstroPaper 主题?
下一篇
Predefined color schemes