为什么在Solid Start的SSR中,组件在客户端渲染时会重复执行server$函数?
我在用Solid Start做SSR时遇到了奇怪的问题,布局组件里用server$获取数据后,切换页面再回来,发现server$函数又重新执行了,明明应该只在服务端跑啊。我检查过路由配置没问题,控制台也没报错,但网络请求明显重复了。
代码是这样写的:
// src/routes/layout.tsx
import { server$ } from '@solid-start/server';
export const data = server$(async () => {
console.log('正在获取数据...'); // 客户端切换回来时会再打印
return await fetch('https://api.example.com/data');
});
尝试过把server$移到组件内部,或者加use-server属性都不管用,这个重复请求到底是怎么回事啊?
要解决这个问题,把 server$ 移到组件内部,并结合 useServer 来用,这样它才能正确缓存。比如:
这样 data 就会被缓存住,组件重新渲染也不会重复执行。记住,server$ 本身不是缓存的,useServer 才是关键。
server$的执行和组件的生命周期挂钩,每次组件重新挂载时都会重新调用。改成这样,用memo缓存数据:这样可以避免重复请求。如果还有问题,检查是否用了强制刷新状态的逻辑。