服务端渲染(SSR)
概述
尽管 alova 的定位并不是在 nodejs 中进行请求,但为了可以结合 UI 框架的服务端渲染(Nuxt3.x / Nextjs / sveltekit),我们也对它做了适配。尽管例如Nuxt3.x
、Sveltekit
中提供了内置的请求功能,但如果你选择使用 alova 的话,你可以同时在服务端和客户端中使用 alova 管理请求,而不是服务端和客户端分别使用不同的请求方案来管理它们。
这里有一些在 SSR 中使用 alova 需要注意的地方,以及不同 UI 框架的 SSR 中的使用示例。
在服务端调用接口
SSR 中经常需要在服务端获取数据并渲染成 HTML,这种情况下我们 不能使用 alova 的 use hooks(也无需使用)来获取数据,以下我们将分别对支持的 SSR 框架进行展示。
Nuxt3.x
在 Nuxt3.x 中提供了useAsyncData
在服务端初始化页面数据,同时还提供了useFetch
和$fetch
请求函数,这些可以同时在服务端和客户端使用的请求函数真的很方便。尽管如此,如果你希望在 nuxt 中使用 alova 的话,你可以使用 useAsyncData + alova.Method 组合的方式完成服务端数据获取,这与你平时使用useAsyncData
没什么区别。
<script setup>
const todoListGetter = alovaInstance.Get('/todo/list', {
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
});
// 在useAsyncData中返回promise
const { data, pending, refresh } = useAsyncData(async () => {
return todoListGetter.send();
});
</script>
Nextjs
- App Router
- Pages Router
在 nextjs 的 app router 模式下,您可以在异步组件中直接使用方法实例。
const App = async () => {
const data = await alovaInstance.Get('/todo/list', {
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
});
// then ...code
return data.map(item => (
<div>
<span>{item.title}</span>
<span>{item.time}</span>
</div>
));
};
export default App;
在传统的 pages router 模式下,nextjs 提供程序固定的服务端数据初始化函数,例如 getStaticProps
、getServerSideProps
和 getStaticPaths
等,你可以直接使用方法实例在函数中调用 api。
const todoListGetter = alovaInstance.Get('/todo/list', {
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
});
export const getServerSideProps = async ctx => {
const list = await todoListGetter.send();
return {
props: {
list
}
};
};
export default function App(props) {
return props.list.map(item => (
<div>
<span>{item.title}</span>
<span>{item.time}</span>
</div>
));
}
Sveltekit
Sveltekit 中也提供了load
函数进行服务端的页面数据初始化,你同样可以在函数中直接使用 method 实例调用接口。例如在+page.server.js
中调用接口。
const todoListGetter = alovaInstance.Get('/todo/list', {
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
});
/** @type {import('./$types').PageServerLoad} */
export async function load({ params }) {
return {
list: todoListGetter
};
}
在 SSR 中使用 usehooks
由于每个 SSR 框架都有各自的在服务端中初始化数据的方式,因此在 SSR 中生成 html 时,组件中的useRequest
和useWatcher
即使将immediate
设置为true
也不会发起请求,因为这更像是客户端初始化数据。
不过,如果你需要像客户端中一样初始化页面的数据,也可以设置immediate
为true
,当页面在浏览器中运行时,你可以和往常一样使用 alova 的所有功能。