扩展语法
Markdown 扩展
VitePress 扩展很多 Markdown 的语法
标题锚点
标题会自动应用锚点。但使用 markdown.anchor 选项配置锚点的渲染。将标题链接为 #my-anchor,而不是默认的 #使用自定义锚点
# 使用自定义锚点 {#my-anchor}Emoji 表情
输入
:tada: :100:**输出:**🎉 💯
目录表 (TOC)
在页面中生成目录表,可以使用 markdown.toc 选项配置 TOC 的呈现效果
[[toc]]自定义容器
自定义容器可以通过它们的类型、标题和内容来定义
::: 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" 之后附加文本来设置自定义标题
::: danger STOP
危险区域,请勿继续
:::
::: details 点我查看代码
```js
console.log('Hello, VitePress!')
```
:::可以通过在站点配置中添加以下内容来全局设置自定义标题,如果不是用英语书写,这会很有帮助:
// config.ts
export default defineConfig({
// ...
markdown: {
container: {
tipLabel: "提示",
warningLabel: "警告",
dangerLabel: "危险",
infoLabel: "信息",
detailsLabel: "详细信息"
}
}
// ...
})代码块中的语法高亮
VitePress 使用 Shiki 在 Markdown 代码块中使用彩色文本实现语法高亮。Shiki 支持多种编程语言。需要做的就是将有效的语言别名附加到代码块的开头:
```js
export default {
name: "MyComponent"
// ...
}
```
```html
<ul>
<li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
</ul>
```在 Shiki 的代码仓库中,可以找到合法的编程语言列表。还可以全局配置中自定义语法高亮主题
代码块中实现行高亮
下面的代码实现第 4 行高亮
```js{4}
export default {
data () {
return {
msg: 'Highlighted!'
}
}
}
```除了单行之外,还可以指定多个单行、多行,或两者均指定:
- 多行:例如
{5-8}、{3-10}、{10-17} - 多个单行:例如
{4,7,9} - 多行与单行:例如
{4,7-13,16,23-27,40}
```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] 注释方式实现行高亮
```js
export default {
data() {
return {
msg: "Highlighted!" // [!code highlight]
}
}
}
```代码块中聚焦
在某一行上添加 // [!code focus] 注释将聚焦它并模糊代码的其他部分。还可以使用 // [!code focus:<lines>] 定义要聚焦的行数
```js
export default {
data() {
return {
msg: "Focused!" // [!code focus]
}
}
}
```代码块中的颜色差异
在某一行添加 // [!code --] 或 // [!code ++] 注释将会为该行创建 diff,同时保留代码块的颜色
```js
export default {
data () {
return {
msg: 'Removed' // [!code --]
msg: 'Added' // [!code ++]
}
}
}
```高亮“错误”和“警告”
在某一行添加 // [!code warning] 或 // [!code error] 注释将会为该行相应的着色
```js
export default {
data() {
return {
msg: "Error", // [!code error]
msg: "Warning" // [!code warning]
}
}
}
```行号
可以通过以下配置为每个代码块启用行号
export default {
markdown: {
lineNumbers: true
}
}可以在代码块中添加 :line-numbers / :no-line-numbers 标记来覆盖在配置中的设置。还可以通过在 :line-numbers 之后添加 = 来自定义起始行号,例如 :line-numbers=2 表示代码块中的行号从 2 开始
```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'
```代码组
可以像这样对多个代码块进行分组:
::: 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 添加的每张图片启用懒加载
export default {
markdown: {
image: {
// 默认禁用;设置为 true 可为所有图片启用懒加载。
lazyLoading: true
}
}
}高级配置
VitePress 使用 markdown-it 作为 Markdown 渲染器。上面提到的很多扩展功能都是通过自定义插件实现的。可以使用 .vitepress/config.js 中的 markdown 选项来进一步自定义 markdown-it 实例
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 处理。可以并且应该使用相对路径来引用资源:
可以在 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 中的资源的绝对引用:
但是如果正在编写一个主题组件,它动态地链接到资源,例如一个图片,它的 src 基于主题配置:
<img :src="theme.logoPath" />在这种情况下,使用 VitePress 提供的 withBase 来包括路径:
<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 格式。例如:
---
title: Docs with VitePress
editLink: true
---许多站点或默认主题配置选项在 frontmatter 中都有相应的选项,可以使用 frontmatter 来覆盖当前页面的特定行为。还可以定义自己的 frontmatter 数据,以在页面上的动态 Vue 表达式中使用
frontmatter 数据可以通过特殊的 $frontmatter 全局变量来访问:
---
title: Docs with VitePress
editLink: true
---
# {{ $frontmatter.title }}
Guide content还可以使用 useData() 辅助函数在 <script setup> 中访问当前页面的 frontmatter
<script setup>
import { useData } from "vitepress"
const { theme } = useData()
</script>
<template>
<h1>{{ theme.footer.copyright }}</h1>
</template>其他格式
VitePress 也支持 JSON 格式的 frontmatter,以花括号开始和结束:
---
{ "title": "Blogging Like a Hacker", "editLink": true }
---配置
Frontmatter 支持基于页面的配置。在每个 markdown 文件中,可以使用 frontmatter 配置来覆盖站点级别或主题级别的配置选项。此外还有一些配置选项只能在 frontmatter 中定义
通用配置选项
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
title | string | - | 页面的标题。它与 config.title 相同,并且覆盖站点级配置 |
titleTemplate | string | boolean | - | 标题的后缀。它与 config.titleTemplate 相同,它会覆盖站点级别的配置 |
description | string | - | 页面的描述。它与 config.description 相同,它会覆盖站点级别的配置 |
head | HeadConfig[] | - | 指定要为当前页面注入的额外 head 标签。将附加在站点级配置注入的头部标签之后 |
使用示例:
---
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 类型定义:
type HeadConfig = [string, Record<string, string>] | [string, Record<string, string>, string]仅默认主题配置选项
以下 frontmatter 选项仅在使用默认主题时适用。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
layout | doc | home | page | doc | 指定页面的布局。doc:默认文档样式;home:主页布局(可配合 hero 和 features);page:无样式布局,用于完全自定义页面 |
hero | - | - | 当 layout 设置为 home 时,定义主页 hero 部分的内容 |
features | - | - | 当 layout 设置为 home 时,定义 features 部分中显示的项目 |
navbar | boolean | true | 是否显示导航栏 |
sidebar | boolean | true | 是否显示侧边栏 |
aside | boolean | 'left' | true | 定义侧边栏组件在 doc 布局中的位置。false:禁用;true:右侧;'left':左侧 |
outline | number | [number, number] | 'deep' | false | 2 | 大纲中显示的标题级别。覆盖 config.themeConfig.outline.level |
lastUpdated | boolean | Date | true | 是否在页脚显示最后更新时间。指定日期时间则显示该时间而非 git 修改时间戳 |
editLink | boolean | true | 是否在页脚显示编辑链接 |
footer | boolean | true | 是否显示页脚 |
pageClass | string | - | 将额外的类名称添加到特定页面,用于自定义样式 |
使用示例:
---
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 中自定义样式:
.custom-page-class {
/* 特定页面的样式 */
}在 Markdown 使用 Vue
可以在 Markdown 中使用任何 Vue 功能,包括动态模板、使用 Vue 组件或通过添加 <script> 标签为页面的 Vue 组件添加逻辑。
模板化
每个 Markdown 文件首先被编译成 HTML,然后作为 Vue 组件传递给 Vite 流程管道。这意味着可以在文本中使用 Vue 的插值语法:
{{ 1 + 1 }}也可以使用指令 (请注意,原始 HTML 在 Markdown 中也有效):
<span v-for="i in 3">{{ i }}</span>使用组件
可以直接在 Markdown 文件中导入和使用 Vue 组件
- 如果组件只被几个页面使用,建议在使用的地方显式导入它们。这使它们可以正确地进行代码拆分,并且仅在显示相关页面时才加载
- 如果一个组件要在大多数页面上使用,可以通过自定义 Vue 实例来全局注册它们
重要:确保自定义组件的名称包含连字符或采用 PascalCase。否则被视为内联元素并包裹在 <p> 标签内,这将导致激活不匹配,因为 <p> 不允许将块元素放置在其中
<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 插值:
This <span v-pre>{{ will be displayed as-is }}</span>输出:
This {{ will be displayed as-is }}也可以将整个段落包装在 v-pre 自定义容器中:
::: v-pre
{{ This will be displayed as-is }}`
:::输出:
{{ This will be displayed as-is }}默认情况下,代码块是受到保护的,都会自动使用 v-pre 包装,因此内部不会处理任何 Vue 语法。要在代码块内启用 Vue 插值语法,可以在代码语言后附加 -vue 后缀,例如 js-vue:
```js-vue
Hello {{ 1 + 1 }}
```输出
Hello 2请注意,这可能会让某些字符不能正确地进行语法高亮显示
CSS 预处理器
VitePress 内置支持 CSS 预处理器:.scss、.sass、.less、.styl 和 .stylus 文件。无需安装 Vite 专用插件,但必须安装相应的预处理器:
# .scss and .sass
npm install -D sass
# .less
npm install -D less
# .styl and .stylus
npm install -D stylus然后可以在 Markdown 和主题组件中使用以下内容:
<style lang="sass">
.title
font-size: 20px
</style>