Relay 环境

Relay 环境将 Relay 需要的配置,缓存存储和网络处理捆绑在一起,以便操作。

大多数应用程序将创建一个单一的环境实例,并在其中使用它 但是,在具体情况下,您可能需要为不同的目的创建多个环境。例如,您可以在用户登录或注销时创建新的环境实例,以防止不同用户的数据被缓存在一起。类似地,服务器呈现的应用程序可以根据请求创建新的环境实例,使得每个请求获得其自己的缓存,并且用户数据不重叠。或者,您可能在更大的应用程序中具有多个产品或功能,并且希望每个产品或功能都具有特定于产品的网络处理或缓存。

一个简单的例子#

要在Relay Modern中创建一个环境实例,请使用 RelayModernEnvironment 类:

const {
  Environment,
  Network,
  RecordSource,
  Store,
} = require('relay-runtime');

const source = new RecordSource();
const store = new Store(source);
const network = Network.create(/*...*/); // see note below
const handlerProvider = null;

const environment = new Environment({
  handlerProvider, // Can omit.
  network,
  store,
});

有关创建网络的更多详细信息,请参阅 NetworkLayer 指南

一旦你有一个环境,你可以把它传递给你的 QueryRenderer 实例,或通过这个 commitUpdate 功能进入 mutation (见 "Mutations")。

添加handlerProvider #

上面的示例没有配置一个 handlerProvider, 这意味着将提供一个默认的。 Relay Modern 配备了几个内置的处理程序,可以通过处理连接的特殊功能来增强内核(这不是标准的GraphQL功能,而是在Facebook中使用的一组分页约定,在 Relay 光标连接规范, 中详细说明,并且被 Relay 很好地支持)和该 viewer 字段 (它也不标准的 GraphQL schema 特性, 而是在Facebook中广泛使用的特性)。

如果你想提供自己的 handlerProvider, 你可以这样做:

const {
  ConnectionHandler,
  ViewerHandler,
} = require('relay-runtime');

function handlerProvider(handle) {
  switch (handle) {
    // Augment (or remove from) this list:
    case 'connection': return ConnectionHandler;
    case 'viewer': return ViewerHandler;
  }
  throw new Error(
    `handlerProvider: No handler provided for ${handle}`
  );
}