哪些中继对象必须实现“节点”?
Posted
技术标签:
【中文标题】哪些中继对象必须实现“节点”?【英文标题】:Which relay objects must implement `Node`? 【发布时间】:2016-04-29 03:42:30 【问题描述】:https://facebook.github.io/relay/graphql/objectidentification.htm 非常清楚Node
是什么以及它的行为方式,但它没有指定哪些对象必须实现它,或者如果你的对象不实现它会产生什么后果。是否有一组功能不起作用?这些对象是否完全被忽略?并非现有规范中的所有对象(例如pageInfo
)都实现了它,因此它显然不是普遍需要的,但pageInfo
有点特殊。
【问题讨论】:
【参考方案1】:另一种思考Node
接口的方式是实现它的对象可重新获取。可重取性实际上意味着一个对象有一个 ID,我可以使用它来识别和检索它;按照惯例,这些 ID 通常是不透明的,但会包含类型信息和该类型内的标识符(例如,字符串的 Base-64 编码,如“Account:1234”)。
Relay 将以两种方式利用可重取性:
在称为“diffing”的过程中,如果您已经拥有由 IDQWNjb3VudDoxMjM0
标识的对象的一些数据(例如,name
和 address
字段),然后您导航到一个视图,我们显示一些额外的字段(location
,createdAt
),然后 Relay 可以进行最小查询,“重新获取”节点但只请求丢失的字段。
与此相关,Relay 将区分连接,并使用Node
接口来填补那些缺失的数据(例如:通过一些导航组合,您可能拥有视图中某些项目的完整信息,但需要填写在location
中用于范围内的某些项目,或者您可以通过突变修改连接中的项目)。因此,在基本的分页中,Relay 通常最终会发出 first
+ after
查询来扩展连接,但如果您在真实应用程序中检查其网络流量,您还会看到它对项目进行 node
查询在连接内。
所以是的,pageInfo
没有实现 Node
是对的,这样做没有任何意义。
【讨论】:
也就是说:没有什么需要来实现Node
,但是这样做的对象会被更有效地处理?我现在看到facebook.github.io/relay/graphql/connections.htm 提到“如果此字段返回实现 Node 的对象,Relay 可以执行某些优化,但是,这不是使用 Relay 的严格要求。”
正确。我不想对此过于规范,但一个好的经验法则可能是为您的业务域中的“核心”对象实现它,特别是那些可以通过***路由导航到的对象,并且出现在连接中。当然,最佳方法会因应用程序而异,但如果您可以廉价地实现Node
(而且您经常可以),那么至少对于我在上面的经验法则中提到的那些情况,您可能会从中受益。
以上是关于哪些中继对象必须实现“节点”?的主要内容,如果未能解决你的问题,请参考以下文章