Vue 3 的服务端与异步数据获取 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kawa
V2EX    Vue.js

Vue 3 的服务端与异步数据获取

  •  
  •   Kawa 2022-04-08 20:38:22 +08:00 2309 次点击
    这是一个创建于 1293 天前的主,其中的信息可能已经有所发展或是发生改变。

    最近项目才上线, 打算修一下 SSR 半残的状态. 以下内容是根据实践得出的结论, 不过我还是有点迷糊, 所以分享出来给大家看一下, 如果有错误或者有什么想法可以在下面指正.

    内容基于使用 setup script 的情况.

    几个基本点:

    1. SSR 渲染时, 生命周期钩子里只有 beforeCreate 和 created 会被触发. 意味着你不能在其他钩子里执行获取数据的逻辑.
    2. SSR 渲染时, 响应式变量不会被触发更新, 渲染状态以逻辑执行时的数据为准. 意味着如果你使用空数据占位, 等到数据到达时更新数据的做法会在 SSR 时失效.

    几个建议:

    1. 如果你在用响应式变量控制组件的加载状态(isLoading), 替换成Suspense和 Async Setup. 因为isLoading不会触发组件更新, 最后即便你获取到了数据仍然可能渲染出一个骨架屏.
    2. 不要通过监听响应式变量的值变化来控制 Async Function 的挂起状态. 同样是出于响应式变量不会更新的原因, 使用响应式变量挂起和恢复 Async Function 不会起作用, 如果以这种方式去控制 Async Setup, 那么就会导致渲染死锁, 而且如果没有经验, 你几乎难以找到死锁的原因, 因为这样做在客户端是能够正常工作的, 但是在服务端是不行的.
    3. 如果你想往子组件里 Provide 你的异步数据, 请使用注入一个Ref<Promise<T>>, 而不是Ref<T | undefined>, 通过 Promise, 同样还是因为响应式变量不会触发更新, 你只能通过注入 Promise 并 await 他以挂起 setup 函数, 以确保组件被渲染时数据不为空.
    第 1 条附言    2022-05-04 01:09:03 +08:00
    如果你收藏了本帖子, 请注意:
    经过排查, 我发现某些奇奇怪怪的 bug 是因为我使用了一个 denounced Ref 所导致的. 帖子里的内容不完全正确, 但是可以用来作为解决问题的参考思路.
    关于这个疏漏的细节已经差不多忘记了, 拖了很久才想起来在这里发过这个帖子.
    共勉
    3 条回复    2022-04-20 17:53:30 +08:00
    duan602728596
        1
    duan602728596  
       2022-04-08 21:06:59 +08:00
    SSR 时,一部分的数据(比如首屏加载的数据)是从后端获取的。
    输出 html 的同时也会输出 initialData ,比如 b 站会有 window.__INITIAL_DATA__,为了保证数据的一致性,渲染不会出现差异。
    通过 ajax 获取的数据本来就没有必要在后端提前获取数据,所以什么都不输出或者只渲染个骨架屏是正确的做法。
    Kawa
        2
    Kawa  
    OP
       2022-04-08 22:26:09 +08:00
    @duan602728596
    我做的是完全的单页应用, 所有数据都应该从后端获取.
    但是这样做就非常的 SEO 不友好, 这样就得在 SSR 期间把这些数据渲染上去.
    这就是你所说的 initialData.

    但是你貌似没有考虑 initialData 从哪来. 对于完全的单页应用, 所有数据只能通过 API 获取, 那么我就需要考虑怎么去把这些数据搞到手并渲染出来.

    我想的方案就是直接复用客户端的逻辑, 然后塞入 SSR 特有逻辑将数据打包与渲染好的内容一同发给客户端.
    这种方案是我目前想到的实现成本比较低的方案, 可以直接复用客户端的逻辑获取数据.

    目前还没想到实现成本更低的方案, 如果你有什么想法可以说来听听.
    KouShuiYu
        3
    KouShuiYu  
       2022-04-20 17:53:30 +08:00
    我之前的做法是按照单页应用开发,用 node 特殊处理在首页需要注入的初始变量,比如 window.__INITIAL_DATA__= 。。。
    关于     帮助文档     自助推广系统     博客 &bsp;   API     FAQ     Solana     3709 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:50 PVG 08:50 LAX 17:50 JFK 20:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86