Astro 中的 Markdown
Markdown 通常用于创作文本繁重的内容,如博客文章和文档。Astro 包括对 Markdown 文件的内置支持,这些文件还可以包括 frontmatter YAML 来定义自定义属性,例如标题、描述和标签。
在 Astro 中,你可以在 GitHub 风格的 Markdown 中创作内容,然后在 .astro
组件中渲染它。它结合了为内容设计熟悉的书写格式、 Astro 组件语法以及架构的灵活性。
有关其他功能,例如在 Markdown 中包含组件和 JSX 表达式,请添加 @astrojs/mdx
集成以使用 MDX 编写 Markdown 内容。
组织 Markdown 文件
段落标题 组织 Markdown 文件你的本地 Markdown 文件可以保存在 src/
目录中的任何位置。在 src/pages/
目录下的 Markdown 文件将会自动生成 Markdown 页面于你的网页上。
你的 Markdown 内容和 frontmatter 属性都可以通过 本地文件导入 来在组件中加以使用,或者当 使用内容集合助手函数来查询和渲染数据请求 时也能使用。
文件导入 vs 内容集合查询
段落标题 文件导入 vs 内容集合查询要将单个本地的 Markdown 文件的导入到 .astro
组件,可以使用 import
语句来实现,而要想一次性查询多个文件,则可以使用 Vite 的 import.meta.glob()
。从这些 Markdown 文件中导出的数据 都可以在 .astro
组件中使用。
如果你有一组相关的 Markdown 文件,可以考虑 将它们定义为集合。这将为你提供一些便利,其中包括了能够将 Markdown 文件存储在文件系统上的任何位置或使用远程存储。
集合使用专注于内容的优化 API 来 查询和渲染你的 Markdown 内容,这种方式代替了文件导入。集合适用于共享相同结构的数据集,例如博客文章或产品项。当你在 schema 中定义集合时,还可以在编辑器中获得验证、类型安全和智能提示。
类 JSX 的动态表达式
段落标题 类 JSX 的动态表达式导入或查询 Markdown 文件后,你可以在 .astro
组件中编写包含 frontmatter 数据和正文内容的动态 HTML 模板。
可用属性
段落标题 可用属性来自内容集合查询的 Markdown
段落标题 来自内容集合查询的 Markdown当你从自己的集合使用助手函数 getCollection()
或 getEntry()
来请求数据时,你的 Markdown 的 frontmatter 属性都在一个可用的 data
对象之中(例如 post.data.title
)。此外,body
包含了 Markdown 的正文内容,这部分内容是原始的、未编译的字符串类型。
render()
函数将返回你的 Markdown 正文内容、生成的标题列表,以及应用了 remark 或 rehype 插件修改之后的 frontmatter 对象。
导入 Markdown
段落标题 导入 Markdown当使用 import
或 import.meta.glob()
导入 Markdown 时,以下导出的属性在你的 .astro
组件中可用:
file
- 绝对文件路径(例如/home/user/projects/.../file.md
)。url
- 如果是页面,则为页面的 URL(例如/zh-cn/guides/markdown-content
)。frontmatter
- 包含了文件的 YAML frontmatter 中所指定的任何数据。<Content />
- 返回文件完整渲染内容的组件。rawContent()
- 一个函数,将原始 Markdown 文档作为字符串返回。compiledContent()
- 一个异步函数,将 Markdown 文档编译为 HTML 字符串后返回。getHeadings()
- 一个异步函数,用于返回文件中所有标题(<h1>
到<h6>
)的数组,类型为:{ depth: number; slug: string; text: string }[]
。每个标题的slug
都对应了给定标题生成的 ID,可用于锚点链接。
示例 Markdown 博客文章可能会传递以下 Astro.props
对象:
<Content />
组件
段落标题 <Content /> 组件<Content />
组件可通过从 Markdown 文件导入 Content
来使用。此组件返回文件的完整正文内容,并渲染为 HTML。你可以选择将 Content
重命名为你喜欢的任何组件名称。
同样,你也可以通过渲染 <Content />
组件来 渲染 Markdown 集合条目的 HTML 内容。
标题 ID
段落标题 标题 ID在 Markdown 中编写标题会自动为你提供锚点链接,以便你可以直接跳转到页面的某些部分。
Astro 基于 github-slugger
生成标题 id
。你可以在 github-slugger 文档 中找到更多示例。
标题 ID 与插件
段落标题 标题 ID 与插件Astro 将 id
属性注入到 Markdown 和 MDX 文件中的所有标题元素(<h1>
到 <h6>
)中。当你通过文件导入的方式来 导出 Markdown 的属性 时,或者在 使用从内容集合查询返回的 Markdown 内容 时,你都可以从 getHeadings()
工具中检索到这些数据。
你可以通过添加注入 id
属性的 rehype 插件(例如 rehype-slug
)来自定义这些标题 ID。你的自定义 ID 将替代 Astro 的默认 ID,反映在 HTML 输出和 getHeadings()
返回的数组中。
默认情况下,Astro 会在你的 rehype 插件运行后注入 id
属性。但如果其中一个自定义 rehype 插件需要访问 Astro 注入的 ID,你可以直接导入并使用 Astro 的 rehypeHeadingIds
插件。确保在任何依赖它的插件之前添加 rehypeHeadingIds
:
Markdown 插件
段落标题 Markdown 插件Astro 中的 Markdown 支持由 remark 提供,remark 是一个强大的解析和处理工具,拥有一个活跃的生态系统。目前不支持其他 Markdown 解析器,如 Pandoc 和 markdown-it。
Astro 默认应用 GitHub 风格的 Markdown 和 SmartyPants 插件。这带来了一些便利,例如从文本生成可点击的链接,并格式化引用和 em-dashes。
你可以在 astro.config.mjs
中自定义 remark 解析 Markdown 的方式。请参阅完整的 Markdown 配置选项列表。
添加 remark 和 rehype 插件
段落标题 添加 remark 和 rehype 插件Astro 支持添加第三方 remark 和 rehype 插件来解析 Markdown。这些插件允许你扩展你的 Markdown,以获得新的功能,例如 自动生成目录,应用可访问的表情符号标签,以及为你的 Markdown 添加样式。
我们鼓励你浏览 awesome-remark 和 awesome-rehype 来查看流行的插件!请参阅每个插件自己的 README 以获取特定的安装说明。
这个例子将 remark-toc
和 rehype-accessible-emojis
应用于 Markdown 文件:
自定义插件
段落标题 自定义插件为了自定义插件,请在嵌套数组中提供选项对象。
下面的示例将 标题选项添加到 remarkToc
插件 以更改目录的放置位置,并将 behavior
选项添加到 rehype-autolink-headings
插件以便在标题文本之后添加锚标记。
以编程方式修改 frontmatter
段落标题 以编程方式修改 frontmatter你可以通过使用 remark 或 rehype 插件 为所有 Markdown 和 MDX 文件添加 frontmatter 属性。
-
从插件的
file
参数中将customProperty
附加到data.astro.frontmatter
属性:添加于:astro@2.0.0
data.astro.frontmatter
包含给定 Markdown 或 MDX 文档的所有属性。这允许你修改现有的 frontmatter 属性,或者从现有的 frontmatter 计算新属性。 -
将此插件应用于你的
markdown
或mdx
集成配置:或者
现在,每个 Markdown 或 MDX 文件都会在其 frontmatter 中有 customProperty
,使其在 导入你的 markdown 时以及从 布局中的 Astro.props.frontmatter
属性 中可用。
从 MDX 扩展 Markdown 配置
段落标题 从 MDX 扩展 Markdown 配置Astro 的 MDX 集成默认情况下会扩展你的项目的现有 Markdown 配置。要覆盖单个选项,你可以在 MDX 配置中指定它们的等效项。
下面的示例禁用了 GitHub-Flavored Markdown,并为 MDX 文件应用了不同的 remark 插件集:
要避免从 MDX 扩展你的 Markdown 配置,请将 extendMarkdownConfig
选项 (默认开启) 设置为 false
:
单独的 Markdown 页面
段落标题 单独的 Markdown 页面内容集合 和 将 Markdown 导入 .astro 组件 提供了更多用于渲染 Markdown 的功能,并且是处理大部分内容的推荐方法。然而,有时你可能也希望更便捷的只添加单一文件到 src/pages/
并自动为你创建一个简单的页面。
Astro 将 /src/pages/
目录 内的任何受支持的文件视为页面,包括 .md
和其他 Markdown 文件类型。
将文件放入此目录或任何子目录中,将使用文件的路径名自动构建页面路由,并显示渲染为 HTML 的 Markdown 内容。Astro 将自动为你的页面添加一个 <meta charset="utf-8">
标签,以便更轻松地编写非 ASCII 内容。
Frontmatter layout
属性
段落标题 Frontmatter layout 属性为了帮助扩展单个 Markdown 页面的有限功能,Astro 提供了一个特殊的 frontmatter layout
属性,它是 Astro Markdown 布局组件 的相对路径。layout
不是在使用 内容集合 查询和渲染你的 Markdown 内容时的特殊属性,并且不能保证在其预期用例之外得到支持。
如果你的 Markdown 文件位于 src/pages/
中,请创建一个布局组件并将其添加到此布局属性中,来为你的 Markdown 内容提供一个页面外壳。
此布局组件是一个常规 Astro 组件,具有通过 Astro.props
为你的 Astro 模板 自动提供详细的可用属性 的功能。例如,你可以通过 Astro.props.frontmatter
访问 Markdown 文件的 frontmatter 属性:
当使用 frontmatter layout
属性时,你必须在布局中包含 <meta charset="utf-8">
标签,因为 Astro 不再自动添加它。你现在也可以在布局组件中 为你的 Markdown 设置样式。
请求远程 Markdown
段落标题 请求远程 MarkdownAstro 不包括对 内容集合 之外的远程 Markdown 的内置支持!
要直接获取远程的 Markdown 并将其渲染为 HTML,你需要从 NPM 安装并配置你自己的 Markdown 解析器。这不会继承你配置的任何 Astro 内置 Markdown 设置。
在你的项目中实现此功能之前,请确保你了解这些限制,并考虑使用内容集合加载器来代替获取远程 Markdown。
Learn