SWR 与前端数据依赖请求

原文链接:https://zhuanlan.zhihu.com/p/90660704 作者:shud.in

数据依赖关系其实是一个 DAG(有向无环图)。有些数据依赖于其他,有的则无依赖性:

DAG:

对数据的请求则是对这个有向无环图的遍历。最高效的请求方式一定是在拓扑序上尽可能地并行(每当一个数据的依赖都就绪时,立即发起请求)。

仔细想想,大部分时候(请求并不复杂时),我们都用 Promise.all 来描述这个 DAG。举例来说:

Promise.all([fetchA(), fetchB()]).then([a, b] => fetchC(a, b))

有 A,B,C 三个资源,C 依赖 A 与 B 的结果,那么我们偶尔会写如上代码。实际上描述了如下 DAG:

但是当依赖复杂起来……例如:

有 A,B,C,D 四个资源,C 依赖 A,D 依赖 B 与 C……最并行的写法可能是这样的:


(以上假设在 React 中,我们需要尽快渲染 A,B,C,D)

是不是非常头疼(飞面神教流 React 写法)?可以当笔试题了。

但在 SWR 中,你只需要这么写:

依然满足了最大的并行性,与上面完全等价。只需要描述 DAG 中,每一个点的被指向边即可(数据依赖)。

SWR 是如何做到这一点的呢?

这里有一个解释:每次渲染的时候,SWR 会试着执行 key 函数(例如 ()=> '/api/c?a=' + A.id),如果这个函数抛出异常,那么就意味着它的依赖还没有就绪(A === undefined),SWR 将暂停这个数据的请求。在任一数据完成加载时,由于 setState 触发重渲染,上述 Hooks 会被重选执行一遍(再次检查数据依赖是否就绪),然后对就绪的数据发起新的一轮请求。

(以上翻译自 https://twitter.com/shuding_/status/1189607308931653632)

题外话

最近推特上有许多关于 fetch-as-you-render 的讨论,许多人陷入了对模式本身的争论中。

但这篇文章确实提出 fetch-as-you-render 一个非常大的优势(尽可能避免了 waterfall)。对于 waterfall,包括 React Suspense 也没有很好的方案建议:https://reactjs.org/docs/concurrent-mode-suspense.html#for-library-authors 。

另外对于 fetch-as-you-render 的弱势(需要在渲染时才能开始加载数据),ZEIT 的解决办法是配合 Next.js,对第一轮数据(无其他依赖)自动生成并插入 <link link rel=preload> 标签,改进效果非常明显(https://twitter.com/rauchg/status/1189277551321079810)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值