332 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: frontmatter
icon: material-symbols:markdown-outline-rounded
createTime: 2026/01/15 15:03:10
permalink: /guide/auto-frontmatter/
---
## 自动生成 frontmatter
主题 自动为每个 Markdown 文件生成 frontmatter。
::: details 什么是 frontmatter ?
Frontmatter前言是在 Markdown 文件最开头部分使用 YAML 格式编写的元数据区块。
你可以把它想象成 Markdown 文件的“身份证”或“配置说明书”,它不会被直接渲染成网页内容,而是用于配置该文件的相关参数。
Frontmatter 使用三个连字符(---)包裹,位于文件的最开头:
```md
---
title: Post Title
createTime: 2026/01/15 15:03:10
---
这里是 Markdown 正文内容...
```
:::
当前主题支持自动生成的 frontmatter 包括:
- `title`: 文章标题,根据文件名生成
- `createTime`: 文章创建时间,根据文件创建时间生成
- `permalink`: 文章链接
- 默认使用 `nanoid` 生成 8 位随机字符串
- 可以设置为 `filepath` 根据文件路径生成
## 配置
### 全局配置
::: code-tabs#config
@tab .vuepress/config.ts
```ts twoslash
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'
export default defineUserConfig({
theme: plumeTheme({
// autoFrontmatter: true, // 主题内置配置
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
}
})
})
```
@tab .vuepress/plume.config.ts
```ts twoslash
import { defineThemeConfig } from 'vuepress-theme-plume'
export default defineThemeConfig({
// autoFrontmatter: true, // 主题内置配置
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
}
})
```
:::
### 集合配置
可以给每一个集合单独配置 autoFrontmatter
::: code-tabs#config
@tab .vuepress/config.ts
```ts twoslash
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'
export default defineUserConfig({
theme: plumeTheme({
collections: [
{
type: 'doc',
dir: 'guide',
title: '指南',
// autoFrontmatter: true, // 主题内置配置
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
}
}
]
})
})
```
@tab .vuepress/plume.config.ts
```ts twoslash
import { defineThemeConfig } from 'vuepress-theme-plume'
export default defineThemeConfig({
collections: [
{
type: 'doc',
dir: 'guide',
title: '指南',
// autoFrontmatter: true, // 主题内置配置
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
}
}
]
})
```
:::
### 自定义处理逻辑
使用 `transform(data, context, locale)` 配置自定义处理逻辑,`data` 为 frontmatter 数据,`context` 为文件上下文,`locale` 为当前语言路径。
- `transform()` 也可以是异步函数,返回 Promise。
- `transform()` 适用于 全局配置 和 集合配置 中。
::: code-tabs#config
@tab .vuepress/config.ts
```ts
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'
export default defineUserConfig({
theme: plumeTheme({
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
transform: (data, context, locale) => { // 自定义转换
// context.filePath // 文件绝对路径
// context.relativePath // 文件相对路径,相对于源目录
// context.content // markdown 正文内容
data.foo ??= 'foo'
return data
}
}
})
})
```
@tab .vuepress/plume.config.ts
```ts
import { defineThemeConfig } from 'vuepress-theme-plume'
export default defineThemeConfig({
autoFrontmatter: {
title: true, // 自动生成标题
createTime: true, // 自动生成创建时间
permalink: true, // 自动生成永久链接
transform: (data, context, locale) => { // 自定义转换
// context.filePath // 文件绝对路径
// context.relativePath // 文件相对路径,相对于源目录
// context.content // markdown 正文内容
data.foo ??= 'foo'
return data
}
}
})
```
:::
### Interface
```ts
interface AutoFrontmatterContext {
/**
* 文件绝对路径
*/
filepath: string
/**
* 文件相对路径
*/
relativePath: string
/**
* 文件 markdown 内容
*/
content: string
}
interface AutoFrontmatterOptions {
/**
* 是否自动生成 permalink
*
* - `false`: 不自动生成 permalink
* - `true`: 自动生成 permalink ,使用 nanoid 生成 8 位数随机字符串
* - `filepath`: 根据文件路径生成 permalink
*
* @default true
*/
permalink?: boolean | 'filepath'
/**
* 是否自动生成 createTime
*
* 默认读取 文件创建时间,`createTime` 比 vuepress 默认的 `date` 时间更精准到秒
*/
createTime?: boolean
/**
* 是否自动生成 title
*
* 默认读取文件名作为标题
*/
title?: boolean
/**
* 自定义 frontmatter 生成函数
*
* - 你应该直接将新字段添加到 `data` 中
* - 如果返回全新的 `data` 对象,会覆盖之前的 frontmatter
* @param data 页面已存在的 frontmatter
* @param context 当前页面的上下文信息
* @param locale 当前语言路径
* @returns 返回处理后的 frontmatter
*/
transform?: (data: AutoFrontmatterData, context: AutoFrontmatterContext, locale: string) => AutoFrontmatterData | Promise<AutoFrontmatterData>
}
```
## 永久链接 permalink
主题默认使用 `nanoid` 生成一个 8 位的随机字符串作为文件的永久链接。
还可以将 `permalink` 配置为 `'filepath'` ,根据文件路径生成永久链接。
请注意,如果你的文件路径中,包含中文,主题建议在你的项目中安装 `pinyin-pro`
以支持将中文转换为拼音。
::: npm-to
```sh
npm i pinyin-pro
```
:::
::: code-tabs#config
@tab .vuepress/config.ts
```ts twoslash
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'
export default defineUserConfig({
theme: plumeTheme({
autoFrontmatter: {
permalink: 'filepath', // [!code hl]
}
})
})
```
@tab .vuepress/plume.config.ts
```ts twoslash
import { defineThemeConfig } from 'vuepress-theme-plume'
export default defineThemeConfig({
autoFrontmatter: {
permalink: 'filepath', // [!code hl]
}
})
```
:::
示例:
::: code-tree
```md title="docs/blog/服务.md"
---
title: 服务
permalink: /blog/wu-fu/
---
```
```md title="docs/blog/都城.md"
---
title: 都城
permalink: /blog/dou-cheng/
---
```
:::
你应该已经发现 示例中的 `都城.md` 文件的 permalink 为 `/blog/dou-cheng/` ,这显然是错误的,这是因为 `pinyin-pro`
默认的词库对于多音字并不能精确的识别,如果你需要更为精确的转换结果,可以手动安装 `@pinyin-pro/data`
主题为自动加载该词库,以提高精度。
::: npm-to
```sh
npm i @pinyin-pro/data
```
:::
```md title="docs/blog/都城.md"
---
title: 都城
permalink: /blog/du-cheng/
---
```