VitePress 中如何正确使用 Vue 组件的异步数据获取?
我在 VitePress 里写了一个简单的 Vue 组件,想在页面加载时从 API 拿点数据,但发现 onMounted 里请求的数据在 SSR 阶段不生效,页面首次渲染是空的,只有客户端激活后才显示。这体验太差了,有没有办法让 VitePress 在服务端就渲染出真实数据?
我试过把逻辑放到 setup 里直接执行,也试过用 onBeforeMount,但都没用。是不是 VitePress 不支持服务端获取数据?还是我姿势不对?
<script setup>
import { ref, onMounted } from 'vue'
const data = ref(null)
onMounted(async () => {
const res = await fetch('/api/data')
data.value = await res.json()
})
</script>
<template>
<div>{{ data?.title || 'Loading...' }}</div>
</template>
onMounted只在客户端执行。最简单的改法:把 onMounted 换成 onServerPrefetch
这个钩子在 SSR 阶段会执行,客户端也会等数据就绪后再渲染:
这样服务端渲染时就能拿到数据了,客户端激活前也不会显示 Loading。
如果你的数据比较通用,推荐用 VitePress 的 Data Loader 方式
在
.vitepress/theme目录下创建data.js:然后在组件里这样用:
Data Loader 的好处是数据在构建时就获取了,生成的 HTML 直接包含数据,首屏加载更快,也不会有闪烁。
两种方案看你的场景选就行:组件级别的异步数据用
onServerPrefetch,全局共享的数据用 Data Loader。