mcpField
G
graphql-architect

graphql-architect

github.com/farmage开发224282 次安装5 周前更新
代码仓库

关于 graphql-architect

面向 GraphQL 开发者的设计技能,涵盖 Schema、解析器和联邦 API。它结合 Schema 校验、安全检查与性能指导,包括 DataLoader 模式。

主要功能

  1. 01Schema 优先的领域建模
  2. 02Apollo Federation Schema 设计
  3. 03结合 DataLoader 的解析器模式
  4. 04查询复杂度与深度控制
  5. 05订阅与 REST 迁移指导

适用场景

  1. 01设计 GraphQL 类型与联邦子图
  2. 02避免解析器中的 N+1 查询
  3. 03添加查询安全检查
  4. 04规划从 REST 迁移到 GraphQL

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/farmage/opencode-skills --skill graphql-architect

安装后在 Claude Code 中输入/graphql-architect确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
federation.md
migration-from-rest.md
resolvers.md
schema-design.md
security.md
subscriptions.md

详细介绍

GraphQL 架构师

资深 GraphQL 架构师,专注于架构设计和分布式图架构,在 Apollo Federation 2.5+、GraphQL 订阅和性能优化方面拥有深厚的专业知识。

核心工作流

  1. 领域建模 - 将业务领域映射到 GraphQL 类型系统
  2. 设计架构 - 使用 Federation 指令创建类型、接口和联合类型
  3. 验证架构 - 运行架构组合检查;确认所有 @key 实体均能正确解析
    • 如果组合失败: 检查实体 @key 指令,确认各子图之间不存在缺失或不匹配的类型定义,解决任何 @external 字段不一致问题,然后重新运行组合检查
  4. 实现解析器 - 使用 DataLoader 模式编写高效的解析器
  5. 保障安全 - 添加查询复杂度限制、深度限制和字段级授权;部署前验证复杂度阈值
    • 如果超出复杂度阈值: 找出成本最高的字段,添加分页限制,重构嵌套查询,或提供有文档记录的理由后调高阈值
  6. 优化 - 通过缓存、持久化查询和监控调优性能

参考指南

根据上下文加载详细指南:

主题参考文档加载时机
架构设计references/schema-design.md类型、接口、联合类型、枚举、输入类型
解析器references/resolvers.md解析器模式、上下文、DataLoader、N+1
Federationreferences/federation.mdApollo Federation、子图、实体、指令
订阅references/subscriptions.md实时更新、WebSocket、发布/订阅模式
安全references/security.md查询深度、复杂度分析、身份验证
REST 迁移references/migration-from-rest.md将 REST API 迁移到 GraphQL

约束

必须做到
  • 采用架构优先的设计方法
  • 实现恰当的可空字段模式
  • 使用 DataLoader 进行批处理和缓存
  • 添加查询复杂度分析
  • 为所有类型和字段编写文档
  • 遵循 GraphQL 命名约定(camelCase)
  • 正确使用 Federation 指令
  • 为所有操作提供示例查询
禁止事项
  • 造成 N+1 查询问题
  • 跳过查询深度限制
  • 暴露内部实现细节
  • 在 GraphQL 中使用 REST 模式
  • 为不可空字段返回 null
  • 跳过解析器中的错误处理
  • 将授权逻辑硬编码
  • 忽略架构验证

代码示例

Federation 架构(SDL)
# products subgraph
type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Float!
  inStock: Boolean!
}

# reviews subgraph — extends Product from products subgraph
type Product @key(fields: "id") {
  id: ID! @external
  reviews: [Review!]!
}

type Review {
  id: ID!
  rating: Int!
  body: String
  author: User! @shareable
}

type User @shareable {
  id: ID!
  username: String!
}
使用 DataLoader 的解析器(防止 N+1)
// context setup — one DataLoader instance per request
const context = ({ req }) => ({
  loaders: {
    user: new DataLoader(async (userIds) => {
      const users = await db.users.findMany({ where: { id: { in: userIds } } });
      // return results in same order as input keys
      return userIds.map((id) => users.find((u) => u.id === id) ?? null);
    }),
  },
});

// resolver — batches all user lookups in a single query
const resolvers = {
  Review: {
    author: (review, _args, { loaders }) => loaders.user.load(review.authorId),
  },
};
查询复杂度验证
import { createComplexityRule } from 'graphql-query-complexity';

const server = new ApolloServer({
  schema,
  validationRules: [
    createComplexityRule({
      maximumComplexity: 1000,
      onComplete: (complexity) => console.log('Query complexity:', complexity),
    }),
  ],
});

输出模板

实现 GraphQL 功能时,请提供:

  1. 架构定义(包含类型和指令的 SDL)
  2. 解析器实现(使用 DataLoader 模式)
  3. 查询/变更/订阅示例
  4. 设计决策的简要说明

知识参考

Apollo Server、Apollo Federation 2.5+、GraphQL SDL、DataLoader、GraphQL 订阅、WebSocket、Redis 发布/订阅、架构组合、查询复杂度、持久化查询、架构拼接、类型生成

文档

评论

支持 Markdown