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

时间:2018-07-07 05:56:25

标签: caching graphql apollo apollo-client

我最近在official blog上阅读了一篇有关Apollo客户端缓存的文章,其中包含screenshot 这里。

根据该文章,如果当前查询包含一个缓存的对象以及其他对象,则该查询将被删除重复数据,仅查询其余对象。

但是,我通过在服务器上注销查询进行了一些测试,这表明查询并未进行部分重复数据删除。而是将整个查询发送到服务器。

任何人都可以对此提供任何见解。非常感谢。

测试

第一个查询:

{
   post(_id: 1) {
      _id
      title
   }
}

第二个查询:

{
   post(_id: 1) {
      _id
      title
   }
   author(_id: 1) {
      _id
      firstName
   }
}

预期结果: 服务器收到的第二查询仅包含

author(_id: 1) {
   _id
   firstName
}

自博客发送以来,由于post(_id: 1)已在发送第一个查询后被缓存。

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

{
   "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

1 个答案:

答案 0 :(得分:0)

Query deduplication中有一个名为Apollo-Client的主题
来自Apollo-LinkApollo-Client的传输层)的
但是它的作用是删除当前正在获取的现有查询的重复数据

  

如果许多组件显示相同的数据,但您不想多次从服务器获取该数据,则查询重复数据删除将很有用。它通过将查询与当前当前在飞行中的所有查询

进行比较来工作

您可以详细了解herehere

但是它与缓存没有太大关系。.
我认为您正在寻找的是更好地了解如何在Apollo-Client中管理缓存

那么Apollo-Client中如何处理缓存?
您可以在以下官方文档中找到有关该缓存的更多文章:apollo-client-caching

更具体地讲,我相信如果您使用watchQuery / query并确保fetchPolicycache-first,那么它可能不会重新发送查询

我希望这可以使您更好地了解Apollo-Client中的缓存