Skip to content
AstroPaper
Go back

在 AstroPaper 主题中添加新文章

Updated:
Edit page
Table of contents

本指南介绍在 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 格式。更多关于 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规范 URL(绝对地址),用于文章已经在其他来源发布的情况。默认值 = Astro.site + Astro.url.pathname
hideEditPost隐藏文章标题下方的「编辑此页」按钮。仅对当前文章生效。默认值 = false
timezone为当前文章指定 IANA 格式的时区。仅覆盖全局的 site.timezone 配置。默认值 = site.timezone
Tip

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

frontmatter 中只有 title、description 和 pubDatetime 这三个字段必须填写。

标题和描述(摘要)对搜索引擎优化(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" # 远程 URL
description: 这是示例文章的示例描述。
canonicalURL: https://example.org/my-article-was-already-posted-here
---src/content/posts/sample-post.md

VS Code 片段(可选)

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

  • frontmatter:插入推荐的 frontmatter 块
  • template:插入一个基础文章模板(包含 ## 目录)

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

标注(Callouts)

从 AstroPaper v6.1 开始支持标注。它们使用由 rehype-callouts(Obsidian 主题)驱动的简单引用块语法。

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

Note

读者应该留意的补充信息。

Tip

有帮助的建议、快捷方法或最佳实践。

Warning

可能出错或产生意外后果的事情。

Danger

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

Info

中性的信息性说明——紧急程度低于 note。

Success

确认某件事已成功或结果正确。

完整支持的类型包括:NOTE、ABSTRACT、INFO、TODO、TIP、SUCCESS、QUESTION、WARNING、FAILURE、DANGER、BUG、EXAMPLE、QUOTE——每种都有自己的图标和颜色。许多类型还支持别名(例如 TIP 对应 HINT 和 IMPORTANT,WARNING 对应 CAUTION)。完整参考请见 rehype-callouts 文档。

可折叠标注

在类型后加 - 可以让标注默认折叠,加 + 则让它默认展开但仍可折叠:

继续之前请先阅读

这段内容在读者展开之前是隐藏的。适合那些原本会打断阅读节奏的长篇注意事项。

专业技巧(默认展开)

这段内容默认是打开的,但可以折叠。适合你仍希望在首次加载时就可见的可选细节。

自定义标题

在类型后面加上任意文本,即可替换默认的类型标签:

你知道吗?

类型后面的文本会成为标注的标题。不写则自动使用类型名称。

语法速查

> [!NOTE]
> 补充信息。

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

> [!TIP]+ 默认展开但可折叠
> 默认打开。

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

添加目录

默认情况下,文章不包含任何目录(TOC)。要添加目录,写一个 目录 作为 h2 标题(Markdown 中的 ##),并放在你希望它出现的位置:

---
# frontmatter
---

这里放一些使用 AstroPaper 博客主题创建新文章的建议、技巧和经验。

## 目录

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

标题层级

标题层级有一点需要注意:AstroPaper 博客文章使用 frontmatter 中的 title 作为文章的主标题。因此文章中其余的标题应该使用 h2 ~ h6。

这条规则不是强制的,但出于视觉、无障碍和 SEO 的考虑,强烈建议遵守。

语法高亮

AstroPaper 默认使用 Shiki 作为语法高亮器,并使用 @shikijs/transformers 来增强代码块。如果你不想使用这些 transformer,可以把它们移除:

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

export default defineConfig({
  // ...
  markdown: {
    remarkPlugins: [
      [remarkToc, { heading: "(table[ -]of[ -])?contents?|toc|目录" }],
      [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

如果你需要在 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 图片。虽然不是必需的,但建议在 frontmatter 中指定一张与文章相关的 OG 图片。推荐的 OG 图片尺寸是 1200 X 640 px。

Tip

从 AstroPaper v1.4.0 开始,如果未指定 OG 图片,系统会自动生成。详见这篇公告。


Edit page