哪些中继对象必须实现 `Node`?

Which relay objects must implement `Node`?

https://facebook.github.io/relay/graphql/objectidentification.htm 非常清楚 Node 是什么以及它的行为方式,但它没有指定哪些对象必须实现它,或者如果你的对象不实现会产生什么后果它。是否有一组功能不起作用?这些对象是否完全被忽略?并非现有规范中的所有对象(例如 pageInfo)都实现了它,因此它显然不是普遍需要的,但 pageInfo 有点特殊。

考虑 Node 接口的另一种方式是实现它的对象是 可重新获取的 。 Refetchability 实际上意味着一个对象有一个 ID,我可以用它来识别对象并检索它;按照惯例,这些 ID 通常是不透明的,但会包含类型信息和该类型内的标识符(例如,字符串的 Base-64 编码,如 "Account:1234")。

中继将以两种方式利用可重新获取性:

  • 在称为 "diffing" 的过程中,如果您已经拥有由 ID QWNjb3VudDoxMjM0 标识的对象的一些数据(例如,nameaddress 字段) ,然后您导航到我们显示一些附加字段(locationcreatedAt)的视图,然后 Relay 可以进行最小查询 "refetches" 节点但仅请求缺少的字段。
  • 相关地,Relay 将区分连接并使用 Node 界面来填充那些缺失的数据(例如:通过某种导航组合,您可能会在视图中获得某些项目的完整信息,但需要为范围内的某些项目填写 location,或者您可能会通过突变修改连接中的项目)。因此,在基本分页中,Relay 通常最终会发出 first + after 查询来扩展连接,但如果您在真实应用程序中检查其网络流量,您还会看到它发出 node 查询连接中的项目。

所以,是的,pageInfo 没有实现 Node,你是对的,这样做真的没有意义。