Skip to content

高级功能

站点地图(Sitemap)

站点地图帮助搜索引擎发现你的页面,VitePress 一行配置就能开启:

ts
export default defineConfig({
  sitemap: {
    hostname: 'https://你的域名.com'
  }
})

lastUpdated 的话会自动在 sitemap 中加入 <lastmod> 标签:

ts
export default defineConfig({
  lastUpdated: true,
  sitemap: {
    hostname: 'https://你的域名.com'
  }
})

MPA 模式

默认下 VitePress 是 SPA(页面间无刷新切换)。如果希望零 JavaScript、更快的首屏评分,可以开启 MPA 模式:

ts
export default defineConfig({
  mpa: true
})

代价是:每次切换页面会完全刷新,失去 SPA 的流畅感。适合纯文档站,不适合有交互的场景。

构建时数据加载

VitePress 可以在构建时加载外部数据(从 API、本地文件等),再注入到页面中。

基本用法

创建一个 .data.js 文件:

js
// posts.data.js
export default {
  async load() {
    const res = await fetch('https://api.example.com/posts')
    return res.json()
  }
}

.md.vue 文件中导入:

vue
<script setup>
import { data } from './posts.data.js'
</script>

<template>
  <ul>
    <li v-for="post in data" :key="post.id">
      {{ post.title }}
    </li>
  </ul>
</template>

加载本地文件

js
import fs from 'node:fs'

export default {
  watch: ['./data/*.json'],  // 文件变化时自动重新加载
  load(watchedFiles) {
    return watchedFiles.map(f => JSON.parse(fs.readFileSync(f, 'utf-8')))
  }
}

createContentLoader

VitePress 内置了 createContentLoader 辅助函数,专门用于遍历 Markdown 文件:

js
// posts.data.js
import { createContentLoader } from 'vitepress'

export default createContentLoader('posts/*.md', {
  excerpt: true,   // 包含摘要
  transform(data) {
    return data.sort((a, b) => {
      return +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date)
    })
  }
})

加载到的数据格式:

ts
interface ContentData {
  url: string               // 页面 URL
  frontmatter: Record<string, any>  // frontmatter 数据
  src?: string              // 原始 markdown 源
  html?: string             // 渲染后的 HTML
  excerpt?: string          // 摘要
}

提示

数据加载只在构建时执行,数据会序列化为 JSON 打包进客户端。适合中小规模数据,不要加载太大的数据集。

Powered by VitePress