GraphQL中同一类型定义两个不同字段查询是否可行?需拆分类型吗?
结论
这种为同一个GraphQL类型定义多个请求不同字段的查询的做法是完全合规的,属于GraphQL的标准用法,你不需要额外拆分定义两个独立的类型或者处理器。
合理性说明
- GraphQL的核心设计理念就是客户端按需请求字段,同一个类型支持不同的查询片段请求不同字段是原生支持的特性,不存在不合规的问题。
- Apollo Client默认会基于
__typename和id字段自动做缓存归一化,你两个查询返回的同一个Directory实例的数据会自动合并到缓存的同一条记录里,不会出现数据冗余或者冲突,你后续在任意组件里访问同一个Directory的children或者files字段都能直接从缓存拿到已经请求过的数据,不需要重复请求。
可选优化点
你当前的实现已经可以正常运行,如果你想要后续维护更方便,可以做以下调整:
- 把两个查询中重复的Directory基础字段提取为公共片段,避免后续字段修改时要改两处:
fragment DirectoryBaseFields on Directory { name id parentId children } query getDirectory($id: String!) { directory(id: $id) { ...DirectoryBaseFields } }
- 给Apollo Client配置
files字段的字段策略,告诉Apollo怎么合并多次分页拉取的files数据,避免新拉取的分页覆盖旧的内容,示例配置如下:
import { InMemoryCache } from '@apollo/client'; const cache = new InMemoryCache({ typePolicies: { Directory: { fields: { files: { keyArgs: false, merge(existing = { items: [], after: null }, incoming) { return { ...incoming, items: [...existing.items, ...incoming.items], }; }, }, }, }, }, });
内容的提问来源于stack exchange,提问作者Arsenowitch
相关产品推荐
相关产品推荐

