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

Posted

技术标签:

【中文标题】缓存对象上的 Apollo 客户端查询重复数据删除【英文标题】:Apollo Client Query Deduplication on Cached Object 【发布时间】:2018-12-15 15:38:35 【问题描述】:

我最近在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】:

Apollo-Client中有一个主题叫Query deduplication 来自Apollo-LinkApollo-Client的传输层) 但它所做的是对当前正在获取的现有查询进行重复数据删除

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

的所有查询进行比较来工作

您可以在here 和here 阅读更多相关信息

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

那么Apollo-Client 中的缓存是如何处理的?您可以从他们的官方文档中找到更多关于它的文章:apollo-client-caching 更具体地说,对于您的情况,我相信如果您使用 watchQuery / query 并确保 fetchPolicycache-first 那么它可能不会重新发送查询

我希望这能让您更好地了解Apollo-Client 中的缓存

【讨论】:

以上是关于缓存对象上的 Apollo 客户端查询重复数据删除的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 从缓存中查询对象值

在 Apollo 客户端上更新缓存

Apollo 客户端从缓存中删除项目

使用 writeQuery() 更新 Apollo 客户端上的缓存

Apollo 客户端 v3“替换 Y 对象的字段 X 时可能会丢失缓存数据”

ReactJS:Apollo graphql 客户端。缓存不在本地更新