graphql-schema

Руководство по лучшим практикам отрасли для проектирования интуитивно понятных, производительных и поддерживаемых GraphQL-схем. Охватывает основные принципы проектирования, включая клиенто-ориентированную организацию

npx skills add https://github.com/apollographql/skills --skill graphql-schema

GraphQL Schema Design Guide

This guide covers best practices for designing GraphQL schemas that are intuitive, performant, and maintainable. Schema design is primarily a server-side concern that directly impacts API usability.

Schema Design Principles

1. Design for Client Needs

  • Think about what queries clients will write
  • Organize types around use cases, not database tables
  • Expose capabilities, not implementation details

2. Be Explicit

  • Use clear, descriptive names
  • Make nullability intentional
  • Document with descriptions

3. Design for Evolution

  • Plan for backwards compatibility
  • Use deprecation before removal
  • Avoid breaking changes
  • Give every new argument or input field a default value, or make it nullable. Existing clients don't send it, so a required field without a default makes their requests fail validation.

Quick Reference

Type Definition Syntax

"""
A user in the system.
"""
type User {
  id: ID!
  email: String!
  name: String
  posts(first: Int = 10, after: String): PostConnection!
  createdAt: DateTime!
}

Nullability Rules

PatternMeaning
StringNullable - may be null
String!Non-null - always has value
[String]Nullable list, nullable items
[String!]Nullable list, non-null items
[String]!Non-null list, nullable items
[String!]!Non-null list, non-null items

Best Practice: Use [Type!]! for lists - empty list over null, no null items.

Input vs Output Types

# Output type - what clients receive
type User {
  id: ID!
  email: String!
  createdAt: DateTime!
}

# Input type - what clients send
input CreateUserInput {
  email: String!
  name: String
}

# Mutation using input type
type Mutation {
  createUser(input: CreateUserInput!): User!
}

Interface Pattern

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
  email: String!
}

type Post implements Node {
  id: ID!
  title: String!
}

Union Pattern

union SearchResult = User | Post | Comment

type Query {
  search(query: String!): [SearchResult!]!
}

Reference Files

Detailed documentation for specific topics:

  • Types - Type design patterns, interfaces, unions, and custom scalars
  • Naming - Naming conventions for types, fields, and arguments
  • Pagination - Connection pattern and cursor-based pagination
  • Errors - Error modeling and result types
  • Security - Security best practices for schema design

Key Rules

Type Design

  • Define types based on domain concepts, not data storage
  • Use interfaces for shared fields across types
  • Use unions for mutually exclusive types
  • Keep types focused (single responsibility)
  • Avoid deep nesting - flatten when possible

Field Design

  • Fields should be named from client's perspective
  • Return the most specific type possible
  • Make expensive fields explicit (consider arguments)
  • Use arguments for filtering, sorting, pagination

Mutation Design

  • Use single input argument pattern: mutation(input: InputType!)
  • Return affected objects in mutation responses
  • Model mutations around business operations, not CRUD
  • Consider returning a union of success/error types

ID Strategy

  • Use globally unique IDs when possible
  • Implement Node interface for refetchability
  • Base64-encode compound IDs if needed

Ground Rules

  • ALWAYS add descriptions to types and fields
  • ALWAYS use non-null (!) for fields that cannot be null
  • ALWAYS use [Type!]! pattern for lists
  • ALWAYS paginate lists that can grow without limit, such as Query.users or Post.comments: return a connection and give first a default page size
  • NEVER expose database internals in schema
  • NEVER break backwards compatibility without deprecation
  • NEVER add a required argument or input field without a default value
  • PREFER dedicated input types over many arguments
  • PREFER enums over arbitrary strings for fixed values
  • USE ID type for identifiers, not String or Int
  • USE custom scalars for domain-specific values (DateTime, Email, URL)

Больше skills от apollographql

apollo-federation
apollographql
Apollo Federation позволяет объединять несколько GraphQL API (подграфов) в единый суперграф.
apollo-ios
apollographql
Apollo iOS — это строго типизированный GraphQL-клиент для платформ Apple. Он генерирует типы Swift из ваших операций и схемы GraphQL, включает асинхронный клиент с async/await, нормализованный кеш (в памяти или на основе SQLite), подключаемый HTTP-транспорт на основе перехватчиков, обрабатывающий запросы, мутации и многокомпонентные подписки, а также опциональный WebSocket-транспорт (graphql-transport-ws), поддерживающий любые типы операций.
apollo-router
apollographql
Apollo Router — это высокопроизводительный графовый маршрутизатор, написанный на Rust для работы с суперграфами Apollo Federation 2. Он располагается перед вашими подграфами и обрабатывает планирование запросов, выполнение и композицию ответов.
apollo-router-plugin-creator
apollographql
Создание нативных плагинов на Rust для Apollo Router.
apollo-server
apollographql
Полное руководство по созданию GraphQL-серверов с Apollo Server 5.x в различных фреймворках. Охватывает определение схемы, резолверы, настройку контекста и обработку ошибок с поддержкой TypeScript. Поддерживает автономный режим для прототипирования и интеграцию с Express, Fastify, Koa, а также бессерверные среды. Включает шаблоны резолверов, аутентификацию/авторизацию, плагины, DataLoader для предотвращения N+1 и методы оптимизации производительности. Предоставляет справочную документацию по источникам данных, ошибкам...
graphql-operations
apollographql
Руководство по лучшим практикам написания эффективных, типобезопасных GraphQL-операций и их организации с помощью фрагментов. Охватывает запросы, мутации, подписки и фрагменты с соглашениями об именовании, синтаксисом переменных и использованием директив. Подчеркивает основные принципы: запрашивать только необходимые поля, именовать все операции, использовать переменные вместо жестко заданных значений и включать поля id для кэширования. Рекомендует размещать фрагменты вместе с компонентами и использовать директивы @include / @skip для условных полей...
rover
apollographql
Apollo Rover CLI для управления схемами GraphQL, федерацией и локальной разработкой суперграфа. Публикация, получение и проверка схем подграфов; компоновка федеративных суперграфов локально или через GraphOS. Включает проверку схем (валидацию перед развёртыванием), линтинг и интроспекцию запущенных серверов. Команда rover dev запускает локальный Router с автоматической компоновкой схем для рабочих процессов разработки. Поддерживает CI/CD с проверкой перед публикацией и выводом в JSON для скриптов.
rust-best-practices
apollographql
Идиоматические стандарты кодирования Rust на основе руководства по лучшим практикам Apollo GraphQL. Охватывает девять ключевых областей: стили и идиомы кодирования, линтинг clippy, оптимизация производительности, обработка ошибок, шаблоны тестирования, обобщения и диспетчеризация, шаблон конечного автомата, документация и безопасность указателей. Уделяет особое внимание заимствованию вместо клонирования, обработке ошибок на основе Result с thiserror/anyhow и профилированию производительности с помощью релизных сборок. Включает краткое справочное руководство по шаблонам владения, избеганию паник,...