Caching 缓存对象上的Apollo客户端查询重复数据消除

Caching 缓存对象上的Apollo客户端查询重复数据消除,caching,graphql,apollo,apollo-client,Caching,Graphql,Apollo,Apollo Client,我最近在上读到一篇关于Apollo客户端缓存的文章 在这里 根据这篇文章,如果当前查询包含一个缓存对象以及其他对象,那么该查询将被重复数据消除,只查询其余的对象 但是,我通过在服务器上注销查询进行了一些测试,这表明该查询没有被部分重复数据消除。相反,整个查询被发送到服务器 任何人都能对此提供一些见解。非常感谢 测试: 第一个问题: { post(_id: 1) { _id title } } 第二个问题: { post(_id: 1) {

我最近在上读到一篇关于Apollo客户端缓存的文章 在这里

根据这篇文章,如果当前查询包含一个缓存对象以及其他对象,那么该查询将被重复数据消除,只查询其余的对象

但是,我通过在服务器上注销查询进行了一些测试,这表明该查询没有被部分重复数据消除。相反,整个查询被发送到服务器

任何人都能对此提供一些见解。非常感谢

测试

第一个问题:

{
   post(_id: 1) {
      _id
      title
   }
}
第二个问题:

{
   post(_id: 1) {
      _id
      title
   }
   author(_id: 1) {
      _id
      firstName
   }
}
预期结果: 服务器接收到的secomd查询仅包含

author(_id: 1) {
   _id
   firstName
}
根据博客的说法,由于
post(\u id:1)
在发送第一个查询后被缓存

实际结果: 服务器日志:(第二个查询未被重复数据消除)


在阿波罗客户端中有一个名为“查询重复数据消除”的主题

它来自阿波罗链接(阿波罗客户端的传输层)
但它所做的是消除当前正在获取的现有查询的重复数据

如果许多组件显示相同的数据,但您不想多次从服务器获取该数据,则查询重复数据消除可能非常有用。它通过将查询与当前正在运行的所有查询进行比较来工作

你可以阅读更多关于它和

但是它与缓存没有太大关系。
我认为您需要的是更好地了解Apollo Client中缓存的管理方式。

那么,Apollo Client中的缓存是如何处理的呢?
您可以从他们的官方文档中找到更多关于缓存的文章:

更具体地说,对于您的情况,我认为如果您使用/并确保
fetchPolicy
cache first
,那么它可能不会重新发送查询

我希望这能让您更好地了解Apollo客户端中的缓存

{
   "operationName": null,
   "variables": {},
   "query": "{\n  post(_id: 1) {\n    _id\n    title\n    __typename\n  
   }\n}\n"
} /graphql 200 81 - 0.520 ms

{
   "operationName": null,
   "variables": {},
   "query": "{\n  post(_id: 1) {\n    _id\n    title\n    __typename\n  
   }\n  author(_id: 1) {\n    _id\n    firstName\n    __typename\n  }\n}\n"
} /graphql 200 140 - 0.726 ms