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

术语表

3D

数据驱动依赖。Facebook 的一种方式,仅当某个组件实际上将要渲染时才包含渲染该组件的代码。典型用例是

  • 通常为 null 的字段,并且仅在不为 null 时才渲染。
  • 联合。例如,核心新闻提要项具有许多不同的变体,每个变体都是一个独立的 React 组件。我们渲染哪个组件取决于数据(即“数据驱动”。在给定的提要中,大多数变体可能不会被渲染,也不需要下载。
  • 组件可以根据数据具有不同的渲染策略。

请参见 @match 指令和 @module 指令。

抽象类型

GraphQL 联合和接口是抽象类型。请参见 接口

抽象类型细化

请参见 类型细化。如果类型细化是根据类型是否实现特定具体类型(例如 ... on User { name })有条件地包含字段的一种方式,那么抽象类型细化是指根据类型是否实现特定抽象类型(即接口)有条件地包含字段。因此,... on Actor { field }

@arguments

一种 指令,它会修改 片段扩展,用于将参数(使用 @argumentDefinitions 定义)传递给该片段。

...Story_story @arguments(storyId: "1234")

@argumentDefinitions

一种会修改片段定义的指令,用于定义片段可以接受的局部参数的名称以及它们的数据类型。

fragment Store_story on Story
@argumentDefinitions(storyId: {type: "ID!"}) {
# etc
}

如果在片段中使用了变量,但未将其包含在 @argumentDefinitions 指令中,Relay 将要求仅在声明这些变量的查询中或在最终扩展到此类查询中的片段中才能扩展该片段。

请与 变量 进行比较,并参见指南中的 相关部分

工件

由 Relay 编译器生成的通常以 .graphql.js 结尾的文件。

AST

抽象语法树。在 Relay 中,有两种类型的 AST,规范化 AST 和 读取器 AST。

.graphql.js 文件的默认导出是一个 AST。

Relay 编译器会解析和转换 GraphQL 字面量,并生成 Relay AST(请参见 工件)。在编译时完成这项工作可以使 Relay 运行时更快。

可用性

可用性概念是指存储区中是否有足够非陈旧、未失效的数据可以立即完成特定请求,或者是否需要向服务器发出请求才能完成该请求。

Babel 转换

对 Javascript 代码库进行的构建时转换,它会将对

graphql`...`

的调用转换为 require(NAME_OF_GENERATED_ARTIFACT) 调用。

客户端模式扩展

GraphQL 规范 允许您在本地定义新的类型、类型上的新字段、新的指令等。

Relay 支持在客户端模式扩展文件中添加类型和字段。开发人员使用此功能添加包含与图上项目关联的纯本地状态的字段。例如,User 上的 is_selected 字段。

CacheConfig

用于控制如何缓存查询响应的值。最终传递给 environment.execute

检查

存储区的核心功能之一。给定一个操作,它会确定存储区是否具有完成该操作所需的所有数据。调用 DataChecker.check,它会同步地从与操作关联的根节点开始,并遍历存储区中的数据。

在实践中,它作为 environment 上的方法公开。

与获取策略结合使用,由 loadQuery(以及其他方法)用于确定是否需要发出网络请求以完成查询。

提交

在接收到网络响应后,有效负载会被提交或写入存储区。

提交也是用于描述启动突变并将它的数据写入存储区的动词。

编译器

扫描 Javascript 文件以查找 graphql 标记节点并生成适当文件(.graphql.js 文件、$Parameters.js 文件等)的代码部分。

编译器的生成输出会被提交并签入到存储库中。

具体请求

表示查询、订阅或突变的抽象语法树。

与查询、订阅或突变相对应的 .graphql.js 文件的默认导出。

此外,对 graphql...`` 的调用会在构建时通过 Relay Babel 转换变为具体请求。

请参见可预加载的具体请求中的重要安全注意事项。

配置

一个文件或 Javascript 对象,它控制 Relay 编译器 扫描项目的哪些文件,以及其他事项。

@connection

一种声明字段实现 连接 规范的指令。

连接

实现 [连接规范](https://relay.graphql.net.cn/graphql/connections.htm) 的字段。请参见指南中关于 渲染列表数据和分页 的部分。

另请参见 usePaginationFragment

容器

一种术语,指通过查询和片段为子组件提供数据的更高阶组件。与 Relay Modern 相关联。

如果可能,您应该使用 Relay 挂钩 API。

数据检查器

一个类,公开一个名为 check 的方法,该方法会同步地从与操作关联的根节点开始,并遍历存储区中的数据。它会确定存储区中的数据是否足以完成给定操作。

store.check 调用。

DataID

记录的全局唯一标识符。可以使用 缺失字段处理程序 在客户端上生成。通常与 Ent 的 ID 相对应(如果有),但保证等于 __id 字段的值。

updateroptimisticUpdater 函数会传递 RelaySourceSelectorProxy 的实例。在 RelaySourceSelectorProxy 上使用 DataID 调用 .get(id) 将会查找存储区中的该项目,并返回它的代理。

数据屏蔽

指组件不应该能够访问它在片段或查询中声明的任何数据,即使是无意中也不行。这可以防止组件之间意外的数据耦合,并意味着每个组件都可以独立地重构。它消除了在子组件中删除字段会意外地破坏其他组件的风险,从而使组件能够快速移动,并拥有稳定的基础架构

它还指根据此理念将子组件的数据隐藏起来,使其无法被父组件访问。

在 Relay 中,像 query FooQuery { viewer { ...subcomponent_``viewer_name } } 这样声明的查询将无法访问 subcomponent_viewer_name 声明的数据,除非它能够访问表示 subcomponent_viewer_name 片段的 ReaderFragment

请参见 Relay 思维指南

@defer

一种指令,可以添加到片段扩展或内联片段中,以避免阻塞该片段的数据。有关更多详细信息,请参阅 GraphQL 的 关于 @defer 指令的文档

定义

在编译器中,定义是指 GraphQL 字面量中定义操作或片段的文本。

描述符

可以指 OperationDescriptorRequestDescriptor。描述符是在 Relay 代码库内部使用的类型,通常指包含唯一标识操作或请求所需的最小信息量的一个对象,例如(对于 RequestIdentifier),节点、标识符和变量。

开发者工具

一个用于调试 Relay 网络请求、Relay 存储和 Relay 事件的强大 Chrome 扩展。有助于回答诸如“为什么我无法看到预期的数据?”、“为什么这个组件挂起?”等问题。

查看 文档

文档

在编译器中,文档指的是一个包含一个或多个操作或片段定义的 GraphQL 字面量。Relay 要求 JavaScript 文件中的 GraphQL 字面量包含单个定义。

指令

一个以 @ 开头的特殊指令,包含在 graphql 字面量或 graphql 文件中,为 Relay 编译器或服务器提供特殊指令。示例包括 @defer@stream@match

可释放对象

任何包含 .dispose 方法的对象,该方法不接受参数也不返回值。Relay 中的许多对象(例如查询引用和入口点引用)以及许多方法的返回值(例如调用 .subscribe.retain)都是可释放对象。

入口点

一个轻量级对象,包含有关需要加载的组件(以调用 JSResource 的形式)以及在渲染特定路由、弹出窗口或其他条件加载的 UI 之前需要加载的查询(以可预加载的具体请求的形式)的信息。

所有用于初始渲染 UI 片段的查询都应包含在该 UI 的入口点中。

入口点可以包含查询和其他入口点。

另请参见 可预加载的具体请求JSResource

环境

一个将许多其他 Relay 对象整合在一起的对象,最重要的是存储和网络。此外,还包括发布队列、操作加载程序、调度程序和 缺失字段处理程序

使用 RelayEnvironmentProvider 设置,并通过 React 上下文传递。

所有非内部 Relay 钩子都需要在 Relay 环境上下文中调用。

执行

执行查询、变异或订阅(统称为操作)大致意味着“创建一个延迟可观察对象,当订阅时,将发出一个满足操作的网络请求并将返回的数据写入存储”。

Relay 环境上公开了一些 execute 方法。

获取策略

一个字符串,决定在什么情况下发出网络请求,在什么情况下使用存储中的数据(如果可用)来满足查询。要么是 network-onlystore-and-networkstore-or-network 或者 store-only。(某些方法不接受所有获取策略。)

字段

基本上,您可以使用查询、变异、订阅或片段选择的所有内容。例如,viewercomment_create(input: $CommentCreateData)name 都是字段。

GraphQL 架构包含许多字段。

片段

片段是一个超载的术语,在 Relay 中至少有两个不同的含义。

作为 GraphQL 概念的片段

GraphQL 的基本可重用单元。与查询、订阅和变异不同,片段不能单独查询,必须嵌入到请求中。

片段可以扩展到查询、变异、订阅和其他片段中。

片段可以是独立的(如 fragment Component_user on User { name })或内联的,如 query MyQuery { node(id: $id) { ... on User { name } } } 中的 ... on User { name }

片段始终在特定类型上定义(示例中的 User),它定义了可以在其中选择的字段。

Relay 中的片段

在 Relay 中,片段指的是为给定片段/操作读取的字段。该术语也口语化地用来指代读取器 AST。因此,例如,以下查询和片段可能具有相同的读取器 AST

query Foo {
actor { name }
}
fragment Bar on Query {
actor { name }
}

片段标识符

一个字符串,提供足够的信息来提供特定片段的数据。例如

1234{"scale":2}/Story_story/{"scale":2}/"4567"

它通过其持久 ID(1234)标识,后跟它接受的变量,后跟 Story_story 片段(没有持久 ID)以及它使用的变量,后跟引用了哪个故事的 Data ID(可能是 id 字段)。

片段引用

传递给 useFragment 的参数。通过访问片段在另一个 查询、片段、订阅或变异中扩展到的值来获取。例如,

const queryData = usePreloadedQuery(
graphql`query ComponentQuery { viewer { account_user { ...Component_name } } }`,
{},
);

// queryData.viewer is the FragmentReference
// Though this would usually happen in another file, you can
// extract the value of Component_name as follows:
const fragmentData = useFragment(
graphql`fragment Component_name on User { name }`,
queryData?.viewer?.account_user,
);

就像查询引用和描述查询的 graphql 标记字面量(即具体请求)可以用来访问查询的数据一样,片段引用和描述片段的 graphql 标记字面量(即读取器片段)可以用来访问从片段引用的数据。

片段资源

一个支持延迟加载查询的内部类。公开两个重要方法

  • read,它应该在组件的渲染阶段调用。它将尝试从存储中满足查询(通过调用 environment.lookup)并暂停,如果数据不可用。此外,它将尝试读取的结果(无论是 promise、错误还是结果)写入内部缓存,并在 promise 解决或拒绝时更新该缓存值。
  • subscribe,在提交阶段调用,建立对 Relay 存储的订阅。

如果调用 .read 的组件成功加载了查询,但在提交之前在后续钩子上暂停,则该查询的数据可能会在组件最终渲染之前被垃圾回收。因此,依赖 FragmentResource 的组件有渲染空数据的风险。

查询资源 相比。

片段规范解析器

TODO

片段扩展

片段扩展是在查询、订阅、变异或其他片段中包含一个片段的方式。在以下示例中,...Component_name 是一个片段扩展

query ComponentQuery {
viewer {
account_user {
...Component_name
}
}
}

为了使片段可以在特定位置扩展,类型必须匹配。例如,如果 Component_name 定义如下:fragment Component_name on User { name },则此扩展将是有效的,因为 viewer.account_user 的类型为 User

垃圾回收

Relay 可以定期从不再保留的查询中回收数据。

引导之旅 中查看更多信息。

GraphQLTaggedNode

这是对以下调用的类型

graphql`...`

它是 ReaderFragment、ReaderInlineDataFragment、ConcreteRequest 和 ConcreteUpdatableQuery 的并集。

请注意,可以配置 Flow 以了解 GraphQL 字面量的类型是生成的 .graphql.js 文件的默认导出类型。

处理程序

TODO

ID

Relay 对 ID 进行特殊处理。特别是,它执行以下两项操作

  • 编译器会自动在每个类型上添加 id 字段的选择,其中 id 字段的类型为 IDID!
  • 规范化 数据时,如果对象具有 id 属性,则该字段将用作其在存储中的 ID。

架构中有一些类型,其中 id 字段的类型不是 IDID!(例如,类型为 stringnumber)。如果用户自己选择此字段,则此字段将用作 ID。这是一种意外的错误行为。

@include

一个添加到字段、内联片段和片段扩展的指令,允许条件包含。它是 @skip 指令的反面。

在编译器中,@include/@skip 指令将被特殊处理,并生成 Condition 节点。

@inline

一个应用于片段的指令,它使开发人员能够将屏蔽数据传递给在 React 渲染阶段之外执行的函数。

通常,使用 useFragment 读取数据。但是,此函数只能在渲染阶段调用。如果在渲染阶段之外需要存储数据,则开发人员有几个选项

  • 在渲染阶段读取该数据,并将其传递给函数/让函数封闭该数据。(另请参见[#relay])
  • 传递对 @inline 片段的引用,然后可以使用 readInlineData 函数(在渲染阶段之外)访问该引用。

此指令会导致它们在读取父片段时被读取,并通过调用 readInlineData 来取消屏蔽。

接口(GraphQL)

接口是一种抽象类型,它包含类型必须包含的特定字段集以实现该接口。

您可以将接口上的片段扩展到具体类型(例如 query MyQuery { viewer { account_user { ...on Actor { can_viewer_message } } })或将具体类型上的片段扩展到接口(例如 query MyQuery { node(id: 4) { ... on User { name } } })。您不再允许将接口上的片段扩展到接口。

另请参见抽象类型细化。

失效

在某些情况下,很容易确定突变的结果。例如,如果您“点赞”反馈,点赞计数将递增,并且viewer_did_like将被设置为true。但是,在其他情况下,例如当您屏蔽另一个用户时,很难确定对您存储中数据的全部影响。

对于这种情况,Relay 允许您使记录无效(或使整个存储无效),这将导致数据在下一次渲染时重新获取。

请参阅指南中的部分

JSResource

一个轻量级 API,用于指定 React 组件应该按需加载,而不是与第一个 require 捆绑在一起(就像您直接导入或需要它时那样)。

此 API 在入口点文件中的使用是安全的。

请参阅[npm 模块](https://npmjs.net.cn/package/jsresource)。

延迟加载

如果在渲染时发生对数据的请求,则查询或入口点将延迟加载。

延迟加载的查询和入口点存在性能方面的缺点,容易过度和不足获取,并且会导致组件以空数据进行渲染。应避免使用它们。

链接记录

链接记录是可以从另一个记录中直接访问的记录。例如,在查询query MyQuery { viewer { account_user { active_instant_game { id } } } }中,active_instant_game(类型为Application)是account_user的链接记录。

链接记录本身无法查询,但必须通过选择其上的子字段来查询。

比较。

字面量

GraphQL 字面量是对

graphql`...`

的调用。它们在构建时会预先处理,并替换为包含AST 表示的GraphQLTaggedNode

@live

一个 docblock 标记,可以添加到 Relay 解析器中,以将其标记为实时。要了解更多信息,请参阅 Relay 解析器文档中的实时字段部分

查找

Relay 存储公开的主要方法之一。使用读取器选择器遍历存储中的数据并返回快照,其中包含正在读取的数据,以及有关数据是否丢失和其他信息。还通过 Relay 环境公开。

调用Reader.read

@match

一个指令,当与@module结合使用时,允许用户在与 @match 装饰的字段具有特定类型的情况下,将特定 JS 组件与 GraphQL 有效负载的其余部分一起下载。请参阅3D

MatchContainer

一个组件,它渲染与使用 @match 指令装饰的字段一起返回的组件。请参阅3D

丢失字段处理程序

一个函数,它为字段(对于单数和复数链接字段)提供DataID,以及默认值(对于标量字段)。

例如,您可能已经获取了 id 为 4 的项目,并且正在执行选择node(id: 4)的查询。如果没有丢失字段处理程序,Relay 将不知道 id 为 4 的项目将由node(id: 4)返回,因此将尝试通过网络获取此数据。提供丢失字段处理程序可以告知 Relay 此选择的結果存在于 id 为 4 的位置,从而允许 Relay 避免网络请求。

getRelayFBMissingFieldHandlers.js 提供了此和其他丢失字段处理程序。

@module

一个指令,当与@match结合使用时,允许用户指定在与 @match 装饰的字段具有特定类型的情况下,要下载哪些 JS 组件。请参阅3D

模块

TODO

突变

突变是两件事的组合:对后端的突变,然后是对更新数据的查询。

请参阅[关于突变的指南](../guided-tour/updating-data/graphql-mutations)。

突变根查询

突变查询的根对象。在updateroptimisticUpdater中,调用store.getRootField('field_name')将返回来自名为field_name的突变根查询的对象。

此对象上公开的字段与查询中可用的字段不同,并且在不同突变之间有所不同。

网络

Relay 环境包含一个network对象,它公开了一个execute函数。Relay 启动的所有网络请求都将通过这段代码。

这为处理横切关注点(如身份验证和授权)提供了一个便捷的位置。

节点

TODO

规范化

规范化是将嵌套数据(例如服务器响应)转换为扁平数据(Relay 在存储中存储数据的形式)的过程。

请参阅响应规范器

规范化 AST

操作相关联的AST,它(结合变量)可用于

  • 将网络有效负载写入存储,
  • 将乐观响应写入存储,
  • 确定是否可以从存储中的数据满足查询,以及
  • 确定存储中哪些记录是可访问的(用于垃圾回收)。

读取器 AST不同,规范化 AST 包含有关嵌套片段内容的信息。

与操作关联的生成工件(例如FooQuery.graphql.js)包含规范化 AST 和读取器 AST。

规范化选择器

选择器定义了用于遍历图表的起点,用于定位子图,结合 GraphQL 片段、变量和用于遍历应从其开始的根对象的 Data ID。

通知

存储公开的一种方法,它将通知每个订阅者其数据已被修改。导致渲染已修改数据的组件使用新数据重新渲染。

可观察对象

Relay 中用于表示可能当前存在但可能将来才可用的数据的基本抽象。

可观察对象与承诺不同,因为如果可观察对象中的数据已加载,您可以像下面这样同步访问它

const completedObservable = Observable.from("Relay is awesome!");
let valueFromObservable;
observable.subscribe({
next: (value) => {
valueFromObservable = value;
/* this will execute in the same tick */
},
});
console.log(valueFromObservable); // logs out "Relay is awesome!"

这是有利的,因为它允许 Relay 钩子在存储中已经存在数据的情况下不挂起。

在 Relay 中,可观察对象是RxJS 可观察对象的部分实现。

操作

GraphQL中,查询、订阅或突变。

在 Relay 中,每个操作也都有一个关联的片段。因此,准确的思维模型是操作是片段,其类型条件是它们在Query/Mutation/Subscription上,并且 Relay 知道如何对其发出网络请求。

操作描述符

口语上,操作描述符是一个操作和变量。

操作描述符流类型包含 Relay 需要使用数据的三部分信息:读取器选择器规范化选择器请求描述符

变量被过滤以排除不必要的变量,并被填充以包括缺失变量的默认值,从而确保在无关方面不同的请求使用相同的请求 ID 进行缓存。

操作模拟解析器

一个函数,它接受一个操作描述符并返回一个网络响应或错误,在测试时使用。

操作跟踪器

TODO

乐观更新

TODO

乐观更新程序

TODO

分页

逐部分查询数据列表(连接)称为分页。

请参阅graphql 文档和我们的引导游览

有效负载

作为对请求的响应的一部分,从 GraphQL 服务器返回的值。

复数字段

一个字段,其值为记录的数组。

@preloadable

一个指令,它修改查询,并导致 Relay 生成$Parameters.js文件和可预加载的具体请求。如果查询将用作入口点的一部分,则需要此指令。

可预加载的具体请求

一个小型、轻量级的对象,它提供了足够的信息来启动查询并获取完整的查询 AST(ConcreteRequest)。此对象仅在查询使用@preloadable进行注释时才会生成,并且是$parameters.js文件的默认导出。它仅为使用@preloadable进行注释的查询生成。

与具体请求(.graphql.js文件的默认导出)不同,可预加载的具体请求非常轻量级。

请注意,入口点接受预加载的具体请求或在 .queries[queryName].parameters 位置的具体请求。但是,**因为具体请求不是轻量级对象,所以您应该只在此处包含预加载的具体请求。**

另请注意,预加载的查询具有 id 字段,而其他查询没有。

预加载查询注册表

一个中央注册表,当加载特定的查询 AST(具体请求)时,它将执行回调。

由于 React Native 中动态加载组件的当前限制而需要。

项目

为了让 Relay 处理包含 GraphQL 字面量的文件,它必须包含在项目中。项目指定它适用的文件夹以及用于评估 GraphQL 字面量的模式,并包含 Relay 编译器所需的其它信息。

探查器

TODO

发布

store 公开的主要方法之一。接受一个 记录源,从中更新存储中的记录。还会更新存储中哪些记录已更新的映射,这些更新是发布的结果。

一个或多个对 publish 的调用应该紧跟一个对 notify 的调用。

发布队列

一个由环境内部使用的类,用于跟踪、应用和撤销待处理(乐观)更新;提交客户端更新;以及提交服务器响应。

公开突变方法,例如仅将更新添加到队列或从队列中删除更新的 commitUpdate,以及实际执行这些更新并调用 store.publishstore.notifyrun 方法。

查询

一个 GraphQL 查询 是一个请求,可以与一组 变量 一起发送到 GraphQL 服务器,以获取一些数据。它包含一个 字段选择,并且可能包含其他 片段

查询执行器

一个类,它将网络可观察对象的乐观响应和网络响应规范化并发布到存储。

在将每个响应发布到存储后,将调用 store.notify,更新所有需要重新渲染的组件。

environmentexecuteexecuteWithSourceexecuteMutation 等方法中使用。

查询引用

TODO

查询资源

一个帮助处理延迟加载查询的类,并公开两个重要的方法:prepareretain

  • prepare 在组件的渲染方法中调用,它将读取查询的现有缓存值,或获取查询并挂起。它还会将尝试读取的结果(数据、数据的承诺或错误)存储在本地缓存中。
  • retain 在组件成功渲染后调用。

如果调用 .prepare 的组件成功加载查询,但在提交之前挂起了后续的钩子,那么该查询的数据可能会在组件最终渲染之前被垃圾回收。因此,依赖 QueryResource 的组件有渲染空数据的风险。

片段资源 相比。

@raw_response_type

添加到查询的一个指令,告诉 Relay 生成覆盖 commitMutationoptimisticResponse 参数的类型。

有关更多信息,请参阅有关 更新数据 的导览。

读取器

TODO 本节

读取器 AST

一个 AST,用于读取给定片段中选择的数据。

操作片段 都具有读取器 AST。

读取器 AST 包含有关在给定位置传播哪些片段的信息,但与 规范化 AST 不同,它不包含有关在这些片段内选择的字段的信息。

读取器片段

TODO

请参阅 GraphQLTaggedNode

读取器选择器

一个包含足够信息的 对象,以便存储可以遍历其数据并构建由查询或片段表示的对象。直观地说,这“选择”了对象图的一部分。

另请参阅 查找

记录

记录指的是 Relay 存储 中任何通过 ID 存储的项目。 不是记录;大多数其他都是。

记录源

一个用于存储 记录 的抽象接口,通过 DataID 键入,用于表示存储的缓存以及对其更新。

记录源选择器代理

请参阅 记录代理

记录代理

请参阅 存储文档

引用计数

跟踪有多少其他对象可以访问特定对象的模式,并在该数字达到零时清理或处置它。此模式在整个 Relay 代码库中实现。

引用标记

TODO

@refetchable

一个修改片段的指令,并导致 Relay 为该片段生成查询。

这会产生效率提升。该片段可以作为最初单个较大查询的一部分加载(因此只需要一个请求来获取所有数据),但可以独立重新获取。

@relay

一个允许您关闭数据屏蔽的指令,用于复数类型。

请参阅 文档

Relay Classic

一个更旧版本的 Relay。

Relay Hooks

最易于使用、最安全的 Relay API。它依赖于悬念,并且可以在 React 并发模式下安全使用。

您不应该使用 Relay Classic 或 Relay Modern 编写新代码。

Relay Modern

一个旧版本的 Relay。此版本的 Relay 具有一个 API,该 API 非常重视容器。

Relay Resolvers

Relay Resolvers 是一个实验性的 Relay 功能,它允许将派生状态建模为 Relay GraphQL 图中的仅客户端字段。

另请参阅 Relay Resolvers 简介

发布缓冲区

随着查询被释放(不再 保留),它们的根节点存储在固定大小的发布缓冲区中,并且只有当发布缓冲区中没有足够的空间时,才会被新释放的查询逐出。当 Relay 运行垃圾回收时,发布缓冲区中存在且未处置的查询。

发布缓冲区的大小使用 gcReleaseBufferSize 参数配置。

@required

一个 Relay 指令,使处理潜在的 null 值更加符合人体工程学。

另请参阅 @required 指南

请求

请求指的是通过网络发出的 API 调用,用于访问或修改一些数据,或两者兼而有之。

查询在启动时可能涉及也可能不涉及发出请求,这取决于查询是否可以从存储中满足。

请求描述符

一个将 具体请求变量 关联起来的对象,以及一个预先计算的请求 ID。变量应经过过滤以排除不必要的变量,并填充以包含缺失变量的默认值,从而确保以不相关方式不同的请求使用相同的请求 ID 进行缓存。

解析器

一个超载的术语,主要指的是虚拟字段,但也偶尔指的是其他事物。

在描述字段时

解析器字段是一个“虚拟”字段,它由来自同一类型上的片段引用的函数到某个任意值的函数支持。

实时解析器是一个“虚拟”字段,它由外部数据源支持。例如,人们可以使用外部解析器公开存储在本地存储或外部 Flux 存储中的某些状态。

其他含义

它也可以是 片段规范解析器操作模拟解析器

响应

TODO

响应规范器

一个类,公开单个方法 normalize。它将遍历 API 请求的非规范化响应,对其进行规范化,并将规范化的结果写入给定的 MutableRecordSource 中。它由查询执行器调用。

恢复

TODO

保留

TODO

渲染策略

TODO

还原

TODO

根字段

TODO

根类型

根据GraphQL 规范,定义了三个特殊的根类型:Query、Mutation 和 Subscription。查询必须从 Query 根类型中选择字段,等等。

给定页面或屏幕的最外层 React 组件。可以与入口点相关联。

入口点的根由JSResource 指向根 React 组件模块。

标量

TODO

调度器

TODO

模式

针对给定项目,Relay 已知的 GraphQL 类型集合。

模式扩展

TODO

选择

“字段选择”是指您在访问某个对象时请求的字段,作为查询、变异、订阅或片段的一部分。

选择器

参见 规范化选择器

@skip

一个指令,添加到字段、内联片段和片段扩展,并允许条件包含。它是 @include 指令的反面。

快照

将读取器选择器针对当前存储在存储中的数据运行的结果。参见 查找

陈旧

TODO

存储

TODO

@stream

一个指令,可以添加到 List 类型的字段,它允许逐步交付列表中的各个项。客户端可以在等待服务器交付剩余项目时呈现初始项目集。有关更多详细信息,请参阅 GraphQL 的关于 @stream 指令的文档

@stream_connection

一个指令,类似于用于分页的 @connection 指令,但经过修改以允许逐步交付分页队列中的项目。它有一个额外的参数 initial_count,用于指定在初始有效负载中交付多少个项目。要了解有关如何使用此指令的更多信息,请参阅流式分页页面

订阅

Relay 存储公开的方法。接受回调和快照(参见 查找)。如果该快照引用的数据已更新或失效,Relay 存储将在调用 notify 时调用此回调。

订阅

GraphQL 订阅 是一种机制,允许客户端订阅服务器上某段数据的更改,并在该数据发生更改时收到通知。

GraphQL 订阅看起来非常像查询,区别在于它使用订阅关键字

subscription FeedbackLikeSubscription($input: FeedbackLikeSubscribeData!) {
feedback_like_subscribe(data: $input) {
feedback {
id
like_count
}
}
}

事务 ID

network.execute 的给定调用实例的唯一 ID。此 ID 在整个网络请求期间将保持一致。它可以被传递给 RelayModernEnvironment 的自定义日志函数使用。

遍历

有四种树遍历对于理解 Relay 的内部行为至关重要。

  • 使用规范化 AST
    • 当 Relay 在响应规范器中规范化从 GraphQL 服务器接收到的有效负载时;
    • 当 Relay 在数据检查器中读取以确定是否有足够的数据来完成操作时;以及
    • 当 Relay 在引用标记器中确定垃圾回收期间哪些数据不再可访问时。
  • 使用读取器 AST
    • 当 Relay 在读取器中读取数据以进行渲染时。

类型

字段的 GraphQL 类型是对模式上字段的描述,它描述了该字段具有哪些子字段,或它的表示形式(字符串、数字等)。

另请参见 接口抽象类型GraphQL 文档,了解更多信息。

类型细化

在仅在可能实现该类型的特定位置包含特定类型的片段。这允许我们仅当字段定义在特定对象上时才选择字段,否则返回 null。

例如,node(id: 4) { ... on User { name } }。在这种情况下,我们事先不知道 node(id: 4) 是否是用户。如果是,此片段将包含用户名。

另请参见 抽象类型细化

更新器

传递给 commitMutation 的回调,它为应用程序开发人员提供了对存储中数据的强制控制。

参见文档,以及乐观更新器。

记录上的单个值,例如 has_viewer_likedname

链接记录 相比。

变量

GraphQL 变量是一种结构,允许在 GraphQL 查询中引用动态值。它们必须在启动查询时提供,并且可以在嵌套的片段中使用。

参见引导教程中的变量部分,并与 @argumentDefinitions 进行比较。