跳至主要内容
版本:v18.0.0

数据存在

在尝试重用 Relay 存储中缓存的数据时,请务必牢记数据的使用期限;也就是说,数据是否存在于存储中,以及将在存储中存在多长时间。

对于给定查询,Relay 存储中的数据通常会在查询首次获取后存在,只要该查询在屏幕上渲染。如果我们从未为特定查询获取过数据,那么它将不存在于存储中。

但是,即使我们在不同的查询中获取了数据,我们也不能将所有获取到的数据无限期地保存在内存中,因为随着时间的推移,它会变得太大,太陈旧。为了减轻这种情况,Relay 运行一个名为“垃圾收集”的进程,以删除我们不再使用的任何数据。

Relay 中的垃圾收集

具体来说,Relay 通过删除应用程序中任何组件不再引用的任何数据来运行本地内存存储中的垃圾收集。

但是,这可能与重用缓存数据相矛盾;如果数据过早删除,在我们稍后尝试再次重用它之前,这将阻止我们重用该数据来渲染屏幕,而无需等待网络请求。为了解决这个问题,本节将介绍为确保要重用的数据在需要时一直被缓存而需要执行的操作。

注意

注意:通常,您无需担心配置垃圾收集和数据保留,因为这应该由 RelayEnvironment 级别上的应用程序基础设施配置;但是,我们将在此处介绍以供参考。

查询保留

保留查询表示 Relay 应该保留该查询和变量的数据(即不进行垃圾收集)。多个调用者可能会保留单个查询,只要至少有一个调用者保留查询,该查询就不会从存储中删除。

默认情况下,任何使用 useQueryLoader / usePreloadedQuery 或其他 API 的查询组件都会在其挂载期间保留查询。它们卸载后,它们将释放查询,这意味着查询可能在之后随时被删除。

如果您需要在组件生命周期之外保留特定查询,可以使用 retain 操作

// Retain query; this will prevent the data for this query and
// variables from being garbage collected by Relay
const disposable = environment.retain(queryDescriptor);

// Disposing of the disposable will release the data for this query
// and variables, meaning that it can be deleted at any moment
// by Relay's garbage collection if it hasn't been retained elsewhere
disposable.dispose();
  • 如前所述,这将允许您即使在查询组件卸载后也保留查询,从而允许其他组件或同一组件的未来实例重用保留的数据。

控制 Relay 的垃圾收集策略

目前,您可以为 Relay 存储提供 2 个选项来控制垃圾收集的行为

GC 调度程序

gcScheduler 是您可以提供给 Relay 存储的函数,该函数将确定何时应安排 GC 执行运行

// Sample scheduler function
// Accepts a callback and schedules it to run at some future time.
function gcScheduler(run: () => void) {
resolveImmediate(run);
}

const store = new Store(source, {gcScheduler});
  • 默认情况下,如果未提供 gcScheduler 选项,Relay 将使用 resolveImmediate 函数安排垃圾收集。
  • 您可以提供一个调度程序函数,使 GC 调度比默认值更不积极,例如基于时间或 scheduler 优先级,或任何其他启发式方法。按照惯例,实现不应立即执行回调。

GC 释放缓冲区大小

Relay 存储在内部保留一个释放缓冲区,以临时保留特定(可配置)数量的查询,即使在它们被原始所有者释放之后(默认情况下将在渲染该查询的组件卸载时发生)。这使得在返回之前访问过的页面、选项卡或内容时能够(更有可能)重用数据。

为了配置释放缓冲区的大小,我们可以将 gcReleaseBufferSize 选项指定给 Relay 存储

const store = new Store(source, {gcReleaseBufferSize: 10});
  • 请注意,缓冲区大小为 0 等效于没有释放缓冲区,这意味着查询将立即释放并收集。
  • 默认情况下,环境的释放缓冲区大小为 10。

此页面是否有用?

通过以下方式帮助我们改进网站: 回答几个简短的问题.