缓存对象上的 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-Link
(Apollo-Client
的传输层)
但它所做的是对当前正在获取的现有查询进行重复数据删除
如果许多组件显示相同的数据,但您不想从服务器多次获取该数据,则查询重复数据删除可能很有用。它通过将查询与当前进行中
的所有查询进行比较来工作
您可以在here 和here 阅读更多相关信息
但它与缓存并没有太大关系。我认为您正在寻找的是更好地了解Apollo-Client
中的缓存是如何管理的
那么Apollo-Client
中的缓存是如何处理的?您可以从他们的官方文档中找到更多关于它的文章:apollo-client-caching
更具体地说,对于您的情况,我相信如果您使用 watchQuery / query 并确保 fetchPolicy
是 cache-first
那么它可能不会重新发送查询
我希望这能让您更好地了解Apollo-Client
中的缓存
【讨论】:
以上是关于缓存对象上的 Apollo 客户端查询重复数据删除的主要内容,如果未能解决你的问题,请参考以下文章
使用 writeQuery() 更新 Apollo 客户端上的缓存