VitePress 在 Vite + Vue 的基础上提供了一系列面向文档场景的专属特性,涵盖渲染模式、构建优化、国际化、资源处理等维度。
VitePress 默认采用 SSG(静态站点生成)+ SPA 导航 混合策略:
通过 mpa: true 配置启用多页应用模式:
// .vitepress/config.js
export default {
mpa: true
}或通过命令行:vitepress build --mpa
MPA 模式特点:
<script client> 标签:<script client>
document.querySelector('h1').addEventListener('click', () => {
console.log('client side JavaScript!')
})
</script>
# Hello仅在站点几乎不需要客户端交互时使用(如纯文档/博客)。大多数场景推荐默认混合模式。
VitePress 构建时自动按路由分割代码,每个页面只加载自身所需的 JS:
.vitepress/dist/
├── assets/
│ ├── app.js ← 公共运行时
│ ├── index.md.js ← 首页代码
│ ├── guide.md.js ← guide 页代码
│ └── chunks/ ← 共享 chunk
└── index.html// 配置预取行为
export default {
vite: {
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
}
}图片懒加载默认不启用,需在配置中将 markdown.image.lazyLoading 设置为 true,之后 Markdown 中的图片会自动添加 loading="lazy" 属性:
// .vitepress/config.js
export default {
markdown: {
image: { lazyLoading: true }
}
}
<!-- 输出: <img src="..." loading="lazy" alt="架构图"> -->VitePress 内置多语言支持,通过目录结构区分 locale:
docs/
├── index.md ← 默认语言(en)
├── guide.md
├── zh/
│ ├── index.md ← 中文首页
│ └── guide.md
└── .vitepress/
└── config.ts// .vitepress/config.ts
export default {
locales: {
root: {
label: 'English',
lang: 'en'
},
zh: {
label: '简体中文',
lang: 'zh-CN',
themeConfig: {
nav: [
{ text: '指南', link: '/zh/guide' }
],
sidebar: [
{ text: '介绍', link: '/zh/guide' }
]
}
}
}
}每个 locale 可以独立配置 themeConfig(导航、侧边栏),但 vite 和 markdown 配置是全局共享的。
public/ 目录下的文件原样复制到输出根目录:
docs/
├── public/
│ ├── logo.svg → /logo.svg
│ └── data.json → /data.json
└── guide.mdMarkdown 中引用同级资源使用相对路径,构建时自动处理 hash 和路径:

[下载 PDF](files/spec.pdf)<script setup>
import diagram from './assets/diagram.svg'
</script>
<template>
<img :src="diagram" alt="架构图" />
</template>VitePress 的 Markdown 文件本质是 Vue SFC,可直接使用 Vue 语法:
# 标题
{{ 1 + 1 }} <!-- 输出: 2 -->
<div v-for="i in 3" :key="i">
第 {{ i }} 项
</div>// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import MyComponent from './components/MyComponent.vue'
export default {
extends: DefaultTheme,
enhanceApp({ app }) {
app.component('MyComponent', MyComponent)
}
}然后在任意 Markdown 中使用:
<MyComponent :data="someData" /><script setup>
import { useData } from 'vitepress'
const { page, frontmatter, theme, lang } = useData()
</script>
<template>
<p>当前页面: {{ page.relativePath }}</p>
<p>语言: {{ lang }}</p>
</template>VitePress 提供开箱即用的 sitemap 生成:
export default {
sitemap: {
hostname: 'https://example.com'
}
}要包含 <lastmod> 标签,启用 lastUpdated 选项。
底层由 sitemap 模块驱动,支持透传选项:
export default {
sitemap: {
hostname: 'https://example.com',
lastmodDateOnly: false
}
}使用 base 时需追加到 hostname:
export default {
base: '/my-site/',
sitemap: {
hostname: 'https://example.com/my-site/'
}
}在写入 sitemap.xml 前修改条目:
export default {
sitemap: {
hostname: 'https://example.com',
transformItems: (items) => {
items.push({
url: '/extra-page',
changefreq: 'monthly',
priority: 0.8
})
return items
}
}
}| 特性 | 说明 |
|---|---|
| 死链检测 | 构建时自动检测 404 内部链接 |
| 搜索 | 内置本地搜索 / Algolia DocSearch 集成 |
| 编辑链接 | 每页底部 "Edit this page" 跳转源码 |
| 最后更新时间 | 基于 Git 提交时间自动显示 |
| 大纲导航 | 右侧 TOC 自动跟随滚动高亮 |
| 暗色模式 | 跟随系统 / 手动切换,无闪烁 |
| 404 页面 | 自定义 SPA/MPA 模式下的 404 页 |
export default {
ignoreDeadLinks: [
/^\/api\//, // 忽略 /api/ 开头的链接
'https://wip.com' // 忽略特定 URL
]
}