第一个问题,网页中的全局登录状态,就是右上角显示用户名和头像的小组件,用 <HydrationBoundary> + prefetchQuery() 提前在服务端注水然后前端 useQuery(),还是单纯前端 useQuery() 拉取?
主要是涉及到一个 SSG 的问题,因为登录状态需要访问 headers(),这会导致全站失去 SSG ,我在想这样会不会影响性能?
第二个问题,基于上面的不在服务端提前注水的方案,用 useQuery() 封装的用户登录态的 hooks 例如 useLoginedUser(),页面中即使是客户端组件,多个组件一起使用,也很容易出现 "Hydration Error",必须用 useMounted() 来判断是否运行于浏览器,这样才能不出错。
我估计是服务端预渲染阶段拿不到 cookies ,始终得到未登录的结果,这就和客户端不一致了。 我的想法对吗?这个问题有啥解决方案吗?
当然,用上面的 <HydrationBoundary> 放在根节点,再提前 prefetchQuery() 拿到登录态,这样就没问题了,但还是那个问题,这就失去 SSG 了。
而且就算局部 <HydrationBoundary> 来获取登录态,给局部组件用,但全局右上角那个登录态没有注水,运行 useQuery() 还是会导致 Hydration Error 。