{T}

扩展语法

Markdown 扩展

VitePress 扩展很多 Markdown 的语法

标题锚点

标题会自动应用锚点。但使用 markdown.anchor 选项配置锚点的渲染。将标题链接为 #my-anchor,而不是默认的 #使用自定义锚点

markdown
# 使用自定义锚点 {#my-anchor}

Emoji 表情

输入

code
:tada: :100:

**输出:**🎉 💯

查看 所有支持的 emoji 列表

目录表 (TOC)

在页面中生成目录表,可以使用 markdown.toc 选项配置 TOC 的呈现效果

markdown
[[toc]]

自定义容器

自定义容器可以通过它们的类型、标题和内容来定义

markdown
::: info
This is an info box.
:::

::: tip
This is a tip.
:::

::: warning
This is a warning.
:::

::: danger
This is a dangerous warning.
:::

::: details
This is a details block.
:::

可以通过在容器的 "type" 之后附加文本来设置自定义标题

python
::: danger STOP
危险区域,请勿继续
:::

::: details 点我查看代码
```js
console.log('Hello, VitePress!')
```
:::

可以通过在站点配置中添加以下内容来全局设置自定义标题,如果不是用英语书写,这会很有帮助:

ts
// config.ts
export default defineConfig({
  // ...
  markdown: {
    container: {
      tipLabel: "提示",
      warningLabel: "警告",
      dangerLabel: "危险",
      infoLabel: "信息",
      detailsLabel: "详细信息"
    }
  }
  // ...
})

代码块中的语法高亮

VitePress 使用 Shiki 在 Markdown 代码块中使用彩色文本实现语法高亮。Shiki 支持多种编程语言。需要做的就是将有效的语言别名附加到代码块的开头:

markdown
```js
export default {
  name: "MyComponent"
  // ...
}
```

```html
<ul>
  <li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
</ul>
```

在 Shiki 的代码仓库中,可以找到合法的编程语言列表。还可以全局配置中自定义语法高亮主题

代码块中实现行高亮

下面的代码实现第 4 行高亮

markdown
```js{4}
export default {
  data () {
    return {
      msg: 'Highlighted!'
    }
  }
}
```

除了单行之外,还可以指定多个单行、多行,或两者均指定:

  • 多行:例如 {5-8}{3-10}{10-17}
  • 多个单行:例如 {4,7,9}
  • 多行与单行:例如 {4,7-13,16,23-27,40}
markdown
```js{1,4,6-8}
export default { // Highlighted
  data () {
    return {
      msg: `Highlighted!
      This line isn't highlighted,
      but this and the next 2 are.`,
      motd: 'VitePress is awesome',
      lorem: 'ipsum'
    }
  }
}
```

也可以使用 // [!code highlight] 注释方式实现行高亮

markdown
```js
export default {
  data() {
    return {
      msg: "Highlighted!" // [!code highlight]
    }
  }
}
```

代码块中聚焦

在某一行上添加 // [!code focus] 注释将聚焦它并模糊代码的其他部分。还可以使用 // [!code focus:<lines>] 定义要聚焦的行数

markdown
```js
export default {
  data() {
    return {
      msg: "Focused!" // [!code focus]
    }
  }
}
```

代码块中的颜色差异

在某一行添加 // [!code --]// [!code ++] 注释将会为该行创建 diff,同时保留代码块的颜色

markdown
```js
export default {
  data () {
    return {
      msg: 'Removed' // [!code --]
      msg: 'Added' // [!code ++]
    }
  }
}
```

高亮“错误”和“警告”

在某一行添加 // [!code warning]// [!code error] 注释将会为该行相应的着色

markdown
```js
export default {
  data() {
    return {
      msg: "Error", // [!code error]
      msg: "Warning" // [!code warning]
    }
  }
}
```

行号

可以通过以下配置为每个代码块启用行号

code
export default {
  markdown: {
    lineNumbers: true
  }
}

可以在代码块中添加 :line-numbers / :no-line-numbers 标记来覆盖在配置中的设置。还可以通过在 :line-numbers 之后添加 = 来自定义起始行号,例如 :line-numbers=2 表示代码块中的行号从 2 开始

markdown
```ts {1}
// 默认禁用行号
const line2 = "This is line 2"
const line3 = "This is line 3"
```

```ts:line-numbers {1}
// 启用行号
const line2 = 'This is line 2'
const line3 = 'This is line 3'
```

```ts:line-numbers=2 {1}
// 行号已启用,并从 2 开始
const line3 = 'This is line 3'
const line4 = 'This is line 4'
```

代码组

可以像这样对多个代码块进行分组:

python
::: code-group

```js [config.js]
/**
 * @type {import('vitepress').UserConfig}
 */
const config = {
  // ...
}

export default config
```

```ts [config.ts]
import type { UserConfig } from 'vitepress'

const config: UserConfig = {
  // ...
}

export default config
```

:::

图片懒加载

通过在配置文件中将 lazyLoading 设置为 true,可以为通过 markdown 添加的每张图片启用懒加载

ts
export default {
  markdown: {
    image: {
      // 默认禁用;设置为 true 可为所有图片启用懒加载。
      lazyLoading: true
    }
  }
}

高级配置

VitePress 使用 markdown-it 作为 Markdown 渲染器。上面提到的很多扩展功能都是通过自定义插件实现的。可以使用 .vitepress/config.js 中的 markdown 选项来进一步自定义 markdown-it 实例

ts
import { defineConfig } from "vitepress"
import markdownItAnchor from "markdown-it-anchor"
import markdownItFoo from "markdown-it-foo"

export default defineConfig({
  markdown: {
    // markdown-it-anchor 的选项
    // https://github.com/valeriangalliat/markdown-it-anchor#usage
    anchor: {
      permalink: markdownItAnchor.permalink.headerLink()
    },
    // @mdit-vue/plugin-toc 的选项
    // https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options
    toc: { level: [1, 2] },
    config: (md) => {
      // 使用更多的 Markdown-it 插件!
      md.use(markdownItFoo)
    }
  }
})

资源处理

引用静态资源

所有的 Markdown 文件都会被编译成 Vue 组件,并由 Vite 处理。可以并且应该使用相对路径来引用资源:

code
![An image](./image.png)

可以在 Markdown 文件、主题中的 *.vue 组件、样式和普通的 .css 文件中引用静态资源,常见的图像,媒体和字体文件会被自动检测并视作资源。

在 Markdown 内,通过链接引用的 PDF 或者其他文档不会被自动视作资源。要使这些文件可用,必须手动将其放在项目的 public 目录内

所有引用的资源,包括那些使用绝对路径的,都会在生产构建过程中被复制到输出目录,并使用哈希文件名。从未使用过的资源将不会被复制。小于 4kb 的图像资源将会采用 base64 内联——可以通过 vite 配置选项进行配置

public 目录

没有直接被 Markdown 或主题组件直接引用的资源,可以放置在源目录的 public 目录中。例如,如果项目根目录是 ./docs,并且使用默认源目录位置,那么 public 目录将是 ./docs/public。放置在 public 中的资源将按原样复制到输出目录的根目录中。

请注意:应使用根绝对路径来引用放置在 public 中的文件——例如,public/icon.png 应始终在源代码中使用 /icon.png 引用

根 URL

如果站点没有部署在根 URL 上,则需要在 .vitepress/config.js 中设置 base 选项。例如,如果计划将站点部署到 https://foo.github.io/bar/,则 base 应设置为 '/bar/'(它应始终以斜杠开头和结尾)。

所有静态资源路径都会被自动处理,来适应不同的 base 配置值。例如,如果 markdown 中有一个对 public 中的资源的绝对引用:

markdown
![An image](/image-inside-public.png)

但是如果正在编写一个主题组件,它动态地链接到资源,例如一个图片,它的 src 基于主题配置:

Vue SFC
<img :src="theme.logoPath" />

在这种情况下,使用 VitePress 提供的 withBase 来包括路径:

Vue SFC
<script setup>
  import { withBase, useData } from "vitepress"

  const { theme } = useData()
</script>

<template>
  <img :src="withBase(theme.logoPath)" />
</template>

frontmatter 语法

VitePress 支持在所有 Markdown 文件中使用 YAML frontmatter,并使用 gray-matter 解析。frontmatter 必须位于 Markdown 文件的顶部,并且需要在三条虚线之间采用有效的 YAML 格式。例如:

markdown
---
title: Docs with VitePress
editLink: true
---

许多站点或默认主题配置选项在 frontmatter 中都有相应的选项,可以使用 frontmatter 来覆盖当前页面的特定行为。还可以定义自己的 frontmatter 数据,以在页面上的动态 Vue 表达式中使用

frontmatter 数据可以通过特殊的 $frontmatter 全局变量来访问:

markdown
---
title: Docs with VitePress
editLink: true
---

# {{ $frontmatter.title }}

Guide content

还可以使用 useData() 辅助函数在 <script setup> 中访问当前页面的 frontmatter

Vue SFC
<script setup>
  import { useData } from "vitepress"

  const { theme } = useData()
</script>

<template>
  <h1>{{ theme.footer.copyright }}</h1>
</template>

其他格式

VitePress 也支持 JSON 格式的 frontmatter,以花括号开始和结束:

markdown
---
{ "title": "Blogging Like a Hacker", "editLink": true }
---

配置

Frontmatter 支持基于页面的配置。在每个 markdown 文件中,可以使用 frontmatter 配置来覆盖站点级别或主题级别的配置选项。此外还有一些配置选项只能在 frontmatter 中定义

通用配置选项

配置项类型默认值说明
titlestring-页面的标题。它与 config.title 相同,并且覆盖站点级配置
titleTemplatestring | boolean-标题的后缀。它与 config.titleTemplate 相同,它会覆盖站点级别的配置
descriptionstring-页面的描述。它与 config.description 相同,它会覆盖站点级别的配置
headHeadConfig[]-指定要为当前页面注入的额外 head 标签。将附加在站点级配置注入的头部标签之后

使用示例:

yaml
---
title: VitePress
titleTemplate: Vite & Vue powered static site generator
description: VitePress
head:
  - - meta
    - name: description
      content: hello
  - - meta
    - name: keywords
      content: super duper SEO
---

HeadConfig 类型定义:

typescript
type HeadConfig = [string, Record<string, string>] | [string, Record<string, string>, string]

仅默认主题配置选项

以下 frontmatter 选项仅在使用默认主题时适用。

配置项类型默认值说明
layoutdoc | home | pagedoc指定页面的布局。doc:默认文档样式;home:主页布局(可配合 herofeatures);page:无样式布局,用于完全自定义页面
hero--layout 设置为 home 时,定义主页 hero 部分的内容
features--layout 设置为 home 时,定义 features 部分中显示的项目
navbarbooleantrue是否显示导航栏
sidebarbooleantrue是否显示侧边栏
asideboolean | 'left'true定义侧边栏组件在 doc 布局中的位置。false:禁用;true:右侧;'left':左侧
outlinenumber | [number, number] | 'deep' | false2大纲中显示的标题级别。覆盖 config.themeConfig.outline.level
lastUpdatedboolean | Datetrue是否在页脚显示最后更新时间。指定日期时间则显示该时间而非 git 修改时间戳
editLinkbooleantrue是否在页脚显示编辑链接
footerbooleantrue是否显示页脚
pageClassstring-将额外的类名称添加到特定页面,用于自定义样式

使用示例:

yaml
---
layout: doc # 或 home、page
navbar: false
sidebar: false
footer: false
lastUpdated: false
# 或指定具体日期
# lastUpdated: 2024-01-01
editLink: false
pageClass: custom-page-class
---

然后在 .vitepress/theme/custom.css 中自定义样式:

css
.custom-page-class {
  /* 特定页面的样式 */
}

在 Markdown 使用 Vue

可以在 Markdown 中使用任何 Vue 功能,包括动态模板、使用 Vue 组件或通过添加 <script> 标签为页面的 Vue 组件添加逻辑。

模板化

每个 Markdown 文件首先被编译成 HTML,然后作为 Vue 组件传递给 Vite 流程管道。这意味着可以在文本中使用 Vue 的插值语法:

Vue SFC
{{ 1 + 1 }}

也可以使用指令 (请注意,原始 HTML 在 Markdown 中也有效):

Vue SFC
<span v-for="i in 3">{{ i }}</span>

使用组件

可以直接在 Markdown 文件中导入和使用 Vue 组件

  • 如果组件只被几个页面使用,建议在使用的地方显式导入它们。这使它们可以正确地进行代码拆分,并且仅在显示相关页面时才加载
  • 如果一个组件要在大多数页面上使用,可以通过自定义 Vue 实例来全局注册它们

重要:确保自定义组件的名称包含连字符或采用 PascalCase。否则被视为内联元素并包裹在 <p> 标签内,这将导致激活不匹配,因为 <p> 不允许将块元素放置在其中

markdown
<script setup>
import CustomComponent from '../../components/CustomComponent.vue'
</script>

# Docs

This is a .md using a custom component

<CustomComponent />

## More docs

...

转义

可以通过使用 v-pre 指令将它们包裹在 <span> 或其他元素中来转义 Vue 插值:

markdown
This <span v-pre>{{ will be displayed as-is }}</span>

输出:

JavaScript
This {{ will be displayed as-is }}

也可以将整个段落包装在 v-pre 自定义容器中:

markdown
::: v-pre
{{ This will be displayed as-is }}`
:::

输出:

JavaScript
{{ This will be displayed as-is }}

默认情况下,代码块是受到保护的,都会自动使用 v-pre 包装,因此内部不会处理任何 Vue 语法。要在代码块内启用 Vue 插值语法,可以在代码语言后附加 -vue 后缀,例如 js-vue

code
```js-vue
Hello {{ 1 + 1 }}
```

输出

code
Hello 2

请注意,这可能会让某些字符不能正确地进行语法高亮显示

CSS 预处理器

VitePress 内置支持 CSS 预处理器:.scss.sass、.less.styl.stylus 文件。无需安装 Vite 专用插件,但必须安装相应的预处理器:

sh
# .scss and .sass
npm install -D sass

# .less
npm install -D less

# .styl and .stylus
npm install -D stylus

然后可以在 Markdown 和主题组件中使用以下内容:

Vue SFC
<style lang="sass">
  .title
    font-size: 20px
</style>