GraphQL 模式内省映射器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/graphql-schema-introspection-mapper。
技能介绍
它要解决的具体问题
GraphQL 团队最常见的维护负担不是写查询,而是让文档和类型定义跟上真实服务。一次 breaking change 落地后,前端拿到的 __type 信息、生成的 TS 类型、CI 里的 schema 校验规则往往各改各的:SDL 手工维护会过期,graphql-codegen 的类型是事后产物,改了字段没人记得同步 @deprecated 标记。结果就是编译期通过、运行时报错,或者更糟——静默丢字段。
这个技能把「摸清 schema 实际长什么样」这件事收敛成一条可重复的路径,而不是每次翻文档。
核心能力与工作方式
它通过标准的 __schema 内省查询去拉取服务端自描述的类型系统,然后把三件事一起做完:
- 类型关系映射:把
OBJECT、INTERFACE、UNION、INPUT_OBJECT之间的字段归属和implements关系梳理成结构化视图,而不是让你对着__type(name: "...")的原始 JSON 自己脑补。 - 弃用字段识别:单独捞出带
isDeprecated的字段和deprecationReason,方便判断哪些还在被消费、哪些可以直接进清理清单。 - 循环引用探测:标出相互引用的对象类型,这在生成代码或做文档导航时会直接影响输出结构,早一步看到能少一次重构。
在此基础上它产出三类可落地的结果:
- SDL 导出——把内省结果还原成 Schema Definition Language,可以直接提交进仓库当作 schema 快照。
- TypeScript 类型——交由
graphql-codegen依据这份映射生成强类型文件,让useQuery的返回值在编译期就有约束。 - 版本差异报告——比较两个版本之间的 schema,输出新增、删除、变更的字段,而不是靠
git diff去肉眼找。
关键步骤是:先确认服务端允许内省(生产环境常被关掉),再发起 __schema 查询,随后做关系整理与循环引用分析,最后按用途分流成 SDL、类型或 diff 报告。
适用边界与注意点
- 内省能力受服务端配置限制。如果网关或 Apollo 层关闭了
introspection,这条路直接走不通,需要改用导出的 SDL 文件作为输入。 - 它描述的是服务端当时的状态。如果 schema 在你读取之后被改动,diff 报告的基准就失真了,做版本对比时要保证两侧快照来自同一次部署。
- 底层依赖的 GraphQL.js 是通用库,同时支持 Node 服务里的 CommonJS(
require())和 ESModule(import)写法。引入工程时注意项目自身的模块规范,避免混用。 deprecated字段只是元数据提示,不改变运行时行为;真正的下线还需要配合查询日志确认没人在用。- 对自研的非标准类型系统(自定义标量、缺乏描述的 schema)映射结果会偏弱,生成的文档信息量取决于原 schema 的注释完整度。
使用场景
- 服务端刚合并一次破坏性变更,需要在发布前对比新旧两个版本的 schema,找出被删除或改名的字段。
- 接手一个没有任何文档的 GraphQL 服务,希望通过 __schema 内省导出完整 SDL 当作 schema 快照。
- 前端准备接入 graphql-codegen,先摸清服务端类型关系和字段归属,再生成可靠的 TypeScript 类型。
- 清理历史字段时,需要列出所有标记 isDeprecated 的字段及其原因,确认哪些仍在被线上查询使用。
适合人员
- 负责 GraphQL 网关的后端工程师,需要在发版前核对 schema 变更范围并更新校验规则。
- 编写前端查询层的工程师,希望依据内省结果生成准确可用的 TypeScript 类型定义。
- 维护 schema 文档的技术作者,需要从真实服务导出 SDL,而不是手工维护一份过期文档。
- 负责依赖清理的技术负责人,需要依据弃用字段清单和循环引用报告决定下线范围。