【问题标题】:Apollo Client Query Deduplication on Cached Object缓存对象上的 Apollo 客户端查询重复数据删除
【发布时间】: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

【问题讨论】:

    标签: caching graphql apollo apollo-client


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2020-11-21
      • 2020-11-27
      • 2017-03-18
      • 2022-08-20
      • 2021-02-01
      • 2019-07-29
      • 2019-03-24
      • 2019-04-02
      相关资源
      最近更新 更多