VitePress 链接 CMS
VitePress 是一个静态站点生成器,但它完全可以与无头(Headless)CMS 集成,从而实现非技术人员也能轻松管理网站内容。通过将 VitePress 与 CMS 连接,你可以将内容管理与站点展示分离开来。
基本思路
集成的核心思路是:在构建时(build time),从 CMS 的 API 获取内容,然后使用这些数据生成静态的 Markdown 文件或直接在 Vue 组件中渲染内容。
我们将使用数据加载(*.data.js)功能来实现这一点,这是 VitePress 提供的用于在构建时获取外部数据的理想方式。
示例:集成 Strapi
假设我们正在使用 Strapi 作为我们的 Headless CMS,并且我们有一个名为 articles 的集合类型。
1. 创建数据加载文件
在你的项目中创建一个数据加载文件,例如 docs/articles.data.js。这个脚本将在构建时运行,从 Strapi API 获取文章列表。
javascript
// docs/articles.data.js
import fetch from 'node-fetch' // Node.js 环境需要引入 fetch
export default {
async load() {
try {
const res = await fetch('https://your-strapi-instance.com/api/articles')
if (!res.ok) {
throw new Error(`HTTP error! status: ${res.status}`)
}
const data = await res.json()
// Strapi 的数据通常在 `data` 属性下
return data.data
} catch (error) {
console.error('Failed to fetch articles:', error)
return [] // 出错时返回空数组
}
}
}注意: 你可能需要处理认证,例如在请求头中添加 API Token。
2. 创建页面来展示内容
现在,创建一个 Markdown 文件 docs/articles.md 来展示我们从 CMS 获取的文章列表。
vue
<!-- docs/articles.md -->
<script setup>
import { useData } from 'vitepress'
// `data` 变量的值就是从 articles.data.js 返回的结果
const { data: articles } = useData()
</script>
# 最新文章
<div class="article-list">
<div v-for="article in articles" :key="article.id" class="article-item">
<h2>{{ article.attributes.title }}</h2>
<p>{{ article.attributes.summary }}</p>
<!-- 你可以创建一个动态路由页面来展示文章详情 -->
<a :href="`/articles/${article.attributes.slug}`">阅读更多</a>
</div>
</div>
<style scoped>
.article-list .article-item {
margin-bottom: 2rem;
border-bottom: 1px solid var(--vp-c-divider);
padding-bottom: 1rem;
}
</style>3. 生成动态路由页面(可选)
对于文章详情页,你可以使用 VitePress 的动态路由功能。你需要修改配置文件,告诉 VitePress 根据从 CMS 获取的数据来生成对应的页面。
javascript
// .vitepress/config.js
import fetch from 'node-fetch'
export default {
// ...
async buildEnd(siteConfig) {
// 在这里可以生成动态页面,但这通常需要更复杂的设置
// 一个更常见的方法是使用 MPA 模式或自定义构建脚本
}
}一个更简单的方法是,在构建之前运行一个单独的 Node.js 脚本:
- 从 CMS 获取所有文章。
- 为每篇文章动态地创建一个 Markdown 文件(例如
docs/articles/my-first-article.md),文件的内容可以是一个简单的模板,引用一个 Vue 组件来展示文章详情。 - 运行
vitepress build。
优点
- 内容解耦:内容管理者可以在友好的 CMS 界面中工作,而开发者可以专注于代码。
- 卓越性能:最终网站仍然是完全静态的,加载速度快,SEO 友好。
- 安全性:由于没有直接连接到数据库,减少了攻击面。
通过这种方式,你可以结合 VitePress 的开发体验和性能优势,以及 Headless CMS 的内容管理灵活性。