【发布时间】:2021-02-23 12:17:12
【问题描述】:
我试图弄清楚 Apollo 客户端中的查询应该如何与缓存交互。
具体来说,我想知道我们是否运行一个获取所有待办事项的查询:
todos {
title
completed
}
然后我们运行一个查询,该查询获取一个已由 todos 查询获取的单个 todo,并请求完全相同的字段:
todo(id: $id) {
title
completed
}
第二个查询应该 a) 从缓存中获取数据,还是 b) 发出网络请求?
我的假设是情况 A。这是基于 Apollo 官方博客文章中的引用:
https://www.apollographql.com/blog/demystifying-cache-normalization/
例如,如果我们要:
- 执行 GetAllTodos 查询、规范化和缓存来自后端的所有待办事项
- 对我们已经使用 GetAllTodos 检索到的待办事项调用 GetTodoById
...那么 Apollo 客户端可以直接进入缓存并直接获取对象,而无需发出另一个请求。
但是,在我的应用中,我不断收到案例 B,即使我已经在不同的查询中请求了所有数据,它也总是发出额外的网络请求。
我认为我做错了什么,所以我查看了这个 Apollo 全栈教程 repo (https://github.com/apollographql/fullstack-tutorial) 并更新了 LaunchDetails 查询以仅请求 GetLaunchList 查询中已经请求的相同数据。这复制了我在上面用 todos 详细描述的相同场景。
查询现在如下所示:
export const GET_LAUNCHES = gql`
query GetLaunchList($after: String) {
launches(after: $after) {
cursor
hasMore
launches {
...LaunchTile
}
}
}
${LAUNCH_TILE_DATA}
`;
export const GET_LAUNCH_DETAILS = gql`
query LaunchDetails($launchId: ID!) {
launch(id: $launchId) {
...LaunchTile
}
}
${LAUNCH_TILE_DATA}
`;
我运行了应用程序,发现为 LaunchDetails 查询发出了一个新的网络请求,尽管在运行 GetLaunchList 查询之后所有需要的数据都已经在缓存中。
我无法在文档中找到任何答案,而且我从示例教程应用程序中看到的结果似乎与上面博客文章中的引用不一致。
如果查询之前已经运行过,查询是否只会查找缓存?如果数据是由不同的查询缓存的,它不能获取缓存的数据吗?我错过了什么吗?
【问题讨论】:
标签: caching apollo apollo-client