【问题标题】:What is the difference between 'store-and-network' vs 'network-only'?“商店和网络”与“仅限网络”有什么区别?
【发布时间】:2021-03-03 02:46:13
【问题描述】:

我已阅读文档,但我仍然对 fetch 策略“store-and-network”和“network-only”之间的区别感到困惑。

“store-and-network”:将重用本地缓存的数据,并且将始终 发送网络请求,无论是否丢失任何数据 是否来自本地缓存。

“network-only”:不会在本地重用 缓存的数据,并且总是会发送一个网络请求来获取 查询,忽略可能在 Relay 中本地缓存的任何数据。

我只是不明白“商店和网络”的意义何在。它声称它“将重用本地缓存的数据”......但它总是从网络中获取,那么它究竟可以重用什么?

在我的应用中,我对两者都进行了试验,发现行为差异为零。有人可以对此进行扩展,并可能演示“存储和网络”和“仅网络”实际上会从查询中返回不同结果的场景吗?

【问题讨论】:

    标签: reactjs relayjs relay


    【解决方案1】:

    存在中继获取策略,以便您可以控制在数据过时或丢失时发生的情况。

    文档在这里扩展了这个概念:https://relay.dev/docs/en/a-guided-tour-of-relay#presence-of-data

    但是,总结一下:

    1. 缺少数据:当检测到某个特定数据不再在任何地方呈现时,中继垃圾会收集存储中的数据。这可以通过多种方式处理,但通常与组件的安装/卸载相关,这些组件维护(ed)对特定片段或查询的引用。一旦 Relay 检测到存储中的某些数据没有活动引用,它就会安排该数据进行垃圾收集。

    2. 过时数据:数据可能仍然过时,但未安排进行垃圾回收。在这种情况下,数据没有“丢失”(就像在 #1 中一样),而只是需要刷新——很可能是在突变之后。仍然存在通过挂载组件对 store 中数据的引用。

    有了这种区别,“仅网络”获取策略将忽略缓存。它不会检查组件需要渲染的数据是否可用;相反,它将始终发起网络请求,并且与商店中数据的存在(或缺乏)或陈旧(或缺乏)无关,就好像商店不存在一样。

    另一方面,“存储和网络”获取策略对存储中数据的存在(或缺乏)或陈旧(或缺乏)敏感。

    它将调查商店中是否存在渲染特定组件所需的数据:

    (a) 如果是,它将渲染并尝试开始渲染组件的子树,这将经历类似的检查数据是否丢失的过程;

    (b) 如果在渲染树 Relay 的任何时候遇到存储中不存在的具有数据需求的组件,则该组件无法渲染,因此网络请求将始终执行。

    因此,“存储和网络”允许您严格控制具有不同数据要求的组件树将如何呈现。将始终发出网络请求 - 获取策略仅指示 Relay 在给定商店的当前状态时应如何处理渲染/暂停渲染组件子树的部分。

    在 (b) 的情况下,一个很好的例子是,您声明了一个片段,该片段定义了以前卸载的组件的数据需求,但该组件已由应用程序中其他地方的组件共享。数据丢失 = 执行网络请求 + Relay 世界暂停渲染。

    换句话说,获取策略实际上是关于您的应用如何呈现,而不是您的应用如何获取。

    【讨论】:

      【解决方案2】:

      通过大量的实验,我找到了答案:

      'network-only' 获取数据,并且不更新中继存储中的任何值。它不会导致其他片段被更新。

      'store-and-network' 获取数据,然后使用这些值更新存储。这将导致任何依赖的片段被更新,这将导致它们的组件被渲染。

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多