'store-and-network' 和 'network-only' 有什么区别?

What is the difference between 'store-and-network' vs 'network-only'?

我已经阅读了文档,但我仍然对获取策略 'store-and-network' 和 'network-only' 之间的区别感到困惑。

"store-and-network": will reuse locally cached data and will always send a network request, regardless of whether any data was missing from the local cache or not.

"network-only": will not reuse locally cached data, and will always send a network request to fetch the query, ignoring any data that might be locally cached in Relay.

我就是搞不懂'store-and-network'的意义是什么。它声称它“将重用本地缓存的数据”......但它总是从网络中获取,所以它究竟可以重用什么?

在我的应用程序中,我对两者都进行了试验,发现行为上的差异为零。有人可以对此进行扩展,并可能演示 'store-and-network' 和 'network-only' 实际上 return 来自查询的不同结果的场景吗?

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

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

但是,总结一下:

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

  2. 陈旧数据:数据可能仍然陈旧但未安排垃圾收集。在这种情况下,数据并未“丢失”(如#1 中所示),而只是需要刷新——很可能是在突变之后。仍然有通过挂载的组件引用存储中的数据。

有了这个区别,“仅限网络”获取策略将完全忽略缓存。它不会检查组件需要呈现的数据是否可用;相反,它将始终发起网络请求,并且不知道您商店中数据的存在(或缺乏)或陈旧(或缺乏),就好像该商店不存在一样。

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

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

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

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

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

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

换句话说,抓取策略实际上是关于您的应用如何呈现,以及您的应用如何抓取。

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

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

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