求可基于GraphQL Schema与操作生成子集Schema的工具或代码
提取GraphQL Schema子集的实用工具与方案
针对你需要从大型GraphQL Schema中提取实际使用子集的需求,这里有几个易用的工具和方案,完全适配你做Mock隔离测试、跟踪Schema使用变化的场景:
1. GraphQL Code Generator(推荐,生态完善)
这是社区最常用的GraphQL代码生成工具,它的@graphql-codegen/schema-ast插件可以轻松提取操作依赖的Schema子集。
- 配置方式:创建
codegen.yml配置文件,指定原始Schema路径、你的操作文件路径,以及输出的子集Schema位置:schema: ./original-schema.graphql documents: ./src/**/*.graphql # 所有包含查询/突变的文件 generates: ./subset-schema.graphql: plugins: - '@graphql-codegen/schema-ast' config: includeDirectives: true # 如果需要保留用到的指令 - 运行方式:执行
graphql-codegen命令,就能生成精准的子集Schema。 - 额外优势:它可以和TypeScript类型生成、React Hooks生成等功能结合,长期维护时能自动同步子集Schema与业务代码的依赖关系,方便跟踪Schema使用的变化。
2. GraphQL Inspector(专注Schema分析)
这个工具主打Schema的对比、分析与提取,专门解决Schema相关的管理问题,非常适合你的跟踪需求。
- 提取命令:直接在终端运行以下命令,就能从操作文件中提取子集Schema:
graphql-inspector extract --schema ./original-schema.graphql --documents ./src/**/*.graphql ./output/subset-schema.graphql - 跟踪变化:它还支持
diff命令,对比不同版本的子集Schema,帮你清晰看到哪些字段、类型新增或不再被业务代码使用,完美契合你跟踪Schema使用情况的需求。
3. 自定义脚本(适合定制化需求)
如果上面的工具不能满足你的特殊过滤规则,比如要排除某些内部类型,你可以用GraphQL官方工具包自己写脚本实现。
核心思路是解析原始Schema和操作文档,递归收集所有被用到的类型、字段、枚举,再生成新的Schema:
const { parse, print, buildASTSchema } = require('graphql'); const { loadSchema, loadDocuments } = require('@graphql-tools/load'); const { GraphQLFileLoader } = require('@graphql-tools/graphql-file-loader'); async function extractSubsetSchema() { // 加载原始Schema和业务操作文档 const originalSchema = await loadSchema('./original-schema.graphql', { loaders: [new GraphQLFileLoader()] }); const operationDocs = await loadDocuments('./src/**/*.graphql', { loaders: [new GraphQLFileLoader()] }); // 收集所有被操作用到的类型、字段(这里需要实现递归收集逻辑) const usedTypes = new Set(); // ... 省略收集逻辑,可通过遍历操作文档的AST节点来实现 // 构建子集Schema的AST并打印成SDL格式 const subsetSchemaAST = // 基于收集的usedTypes构建AST console.log(print(subsetSchemaAST)); } extractSubsetSchema();
使用建议
- 将子集Schema的提取步骤集成到你的CI/CD流程中,每次代码变更自动更新子集Schema,这样就能持续跟踪业务对Schema的使用变化。
- 生成子集Schema后,搭配
@graphql-tools/mock可以快速搭建只包含必要字段的Mock服务,完美支持微服务的隔离测试,避免不必要的Mock数据干扰。
内容的提问来源于stack exchange,提问作者bsmedberg
相关产品推荐
相关产品推荐

