术语表
3D
数据驱动依赖。Facebook 的一种方式,仅当某个组件实际上将要渲染时才包含渲染该组件的代码。典型用例是
- 通常为 null 的字段,并且仅在不为 null 时才渲染。
- 联合。例如,核心新闻提要项具有许多不同的变体,每个变体都是一个独立的 React 组件。我们渲染哪个组件取决于数据(即“数据驱动”。在给定的提要中,大多数变体可能不会被渲染,也不需要下载。
- 组件可以根据数据具有不同的渲染策略。
抽象类型
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
字段的值。
updater
和 optimisticUpdater
函数会传递 RelaySourceSelectorProxy
的实例。在 RelaySourceSelectorProxy
上使用 DataID 调用 .get(id)
将会查找存储区中的该项目,并返回它的代理。
数据屏蔽
指组件不应该能够访问它在片段或查询中声明的任何数据,即使是无意中也不行。这可以防止组件之间意外的数据耦合,并意味着每个组件都可以独立地重构。它消除了在子组件中删除字段会意外地破坏其他组件的风险,从而使组件能够快速移动,并拥有稳定的基础架构。
它还指根据此理念将子组件的数据隐藏起来,使其无法被父组件访问。
在 Relay 中,像 query FooQuery { viewer { ...subcomponent_``viewer_name } }
这样声明的查询将无法访问 subcomponent_viewer_name
声明的数据,除非它能够访问表示 subcomponent_viewer_name
片段的 ReaderFragment
。
请参见 Relay 思维指南。
@defer
一种指令,可以添加到片段扩展或内联片段中,以避免阻塞该片段的数据。有关更多详细信息,请参阅 GraphQL 的 关于 @defer 指令的文档。
定义
在编译器中,定义是指 GraphQL 字面量中定义操作或片段的文本。
描述符
可以指 OperationDescriptor
或 RequestDescriptor
。描述符是在 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-only
、store-and-network
、store-or-network
或者 store-only
。(某些方法不接受所有获取策略。)
字段
基本上,您可以使用查询、变异、订阅或片段选择的所有内容。例如,viewer
、comment_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
字段的类型为ID
或ID!
。 - 当 规范化 数据时,如果对象具有
id
属性,则该字段将用作其在存储中的 ID。
架构中有一些类型,其中 id
字段的类型不是 ID
或 ID!
(例如,类型为 string
或 number
)。如果用户自己选择此字段,则此字段将用作 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)。突变根查询
突变查询的根对象。在updater
或optimisticUpdater
中,调用store.getRootField('field_name')
将返回来自名为field_name
的突变根查询的对象。
此对象上公开的字段与查询中可用的字段不同,并且在不同突变之间有所不同。
网络
Relay 环境包含一个network
对象,它公开了一个execute
函数。Relay 启动的所有网络请求都将通过这段代码。
这为处理横切关注点(如身份验证和授权)提供了一个便捷的位置。
节点
TODO
规范化
规范化是将嵌套数据(例如服务器响应)转换为扁平数据(Relay 在存储中存储数据的形式)的过程。
请参阅响应规范器。
规范化 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.publish
和 store.notify
的 run
方法。
查询
一个 GraphQL 查询 是一个请求,可以与一组 变量 一起发送到 GraphQL 服务器,以获取一些数据。它包含一个 字段选择,并且可能包含其他 片段。
查询执行器
一个类,它将网络可观察对象的乐观响应和网络响应规范化并发布到存储。
在将每个响应发布到存储后,将调用 store.notify
,更新所有需要重新渲染的组件。
由 environment
在 execute
、executeWithSource
和 executeMutation
等方法中使用。
查询引用
TODO
查询资源
一个帮助处理延迟加载查询的类,并公开两个重要的方法:prepare
和 retain
。
prepare
在组件的渲染方法中调用,它将读取查询的现有缓存值,或获取查询并挂起。它还会将尝试读取的结果(数据、数据的承诺或错误)存储在本地缓存中。retain
在组件成功渲染后调用。
如果调用 .prepare
的组件成功加载查询,但在提交之前挂起了后续的钩子,那么该查询的数据可能会在组件最终渲染之前被垃圾回收。因此,依赖 QueryResource
的组件有渲染空数据的风险。
与 片段资源 相比。
@raw_response_type
添加到查询的一个指令,告诉 Relay 生成覆盖 commitMutation
的 optimisticResponse
参数的类型。
有关更多信息,请参阅有关 更新数据 的导览。
读取器
TODO 本节
读取器 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_liked
或 name
。
与 链接记录 相比。
变量
GraphQL 变量是一种结构,允许在 GraphQL 查询中引用动态值。它们必须在启动查询时提供,并且可以在嵌套的片段中使用。
参见引导教程中的变量部分,并与 @argumentDefinitions 进行比较。
此页面是否有用?