graphql-operations

Руководство по лучшим практикам написания эффективных, типобезопасных GraphQL-операций и их организации с помощью фрагментов. Охватывает запросы, мутации, подписки и фрагменты с соглашениями об именовании, синтаксисом переменных и использованием директив. Подчеркивает основные принципы: запрашивать только необходимые поля, именовать все операции, использовать переменные вместо жестко заданных значений и включать поля id для кэширования. Рекомендует размещать фрагменты вместе с компонентами и использовать директивы @include / @skip для условных полей...

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

GraphQL Operations Guide

This guide covers best practices for writing GraphQL operations (queries, mutations, subscriptions) as a client developer. Well-written operations are efficient, type-safe, and maintainable.

Start From the Schema

Write every operation against the project's schema, not against the examples in this guide.

  1. Find the schema before you write anything. Check the schema entry in codegen.ts, graphql.config.*, or apollo.config.*, then look for *.graphql SDL files.
  2. Use only the fields, arguments, and enum values that the schema defines. Field names in this guide, such as updatedAt or orderBy: { field: CREATED_AT, direction: DESC }, are illustrations.
  3. Save the operation as a document next to the client's existing operations. Leave the server schema unchanged unless the user asks for a schema change.

Operation Basics

Query Structure

query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

Mutation Structure

mutation CreatePost($input: CreatePostInput!) {
  createPost(input: $input) {
    id
    title
    createdAt
  }
}

Subscription Structure

subscription OnMessageReceived($channelId: ID!) {
  messageReceived(channelId: $channelId) {
    id
    content
    sender {
      id
      name
    }
  }
}

Quick Reference

Operation Naming

PatternExample
QueryGetUser, ListPosts, SearchProducts
MutationCreateUser, UpdatePost, DeleteComment
SubscriptionOnMessageReceived, OnUserStatusChanged

Variable Syntax

# Required variable
query GetUser($id: ID!) { ... }

# Optional variable with default
query ListPosts($first: Int = 20) { ... }

# Multiple variables
query SearchPosts($query: String!, $status: PostStatus, $first: Int = 10) { ... }

Fragment Syntax

# Define fragment
fragment UserBasicInfo on User {
  id
  name
  avatarUrl
}

# Use fragment
query GetUser($id: ID!) {
  user(id: $id) {
    ...UserBasicInfo
    email
  }
}

Directives

query GetUser($id: ID!, $includeEmail: Boolean!) {
  user(id: $id) {
    id
    name
    email @include(if: $includeEmail)
  }
}

query GetPosts($skipDrafts: Boolean!) {
  posts {
    id
    title
    draft @skip(if: $skipDrafts)
  }
}

Key Principles

1. Request Only What You Need

# Good: Specific fields
query GetUserName($id: ID!) {
  user(id: $id) {
    id
    name
  }
}

# Avoid: Over-fetching
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
    bio
    posts {
      id
      title
      content
      comments {
        id
      }
    }
    followers {
      id
      name
    }
    # ... many unused fields
  }
}

2. Name All Operations

# Good: Named operation
query GetUserPosts($userId: ID!) {
  user(id: $userId) {
    posts {
      id
      title
    }
  }
}

# Avoid: Anonymous operation
query {
  user(id: "123") {
    posts {
      id
      title
    }
  }
}

3. Use Variables, Not Inline Values

# Good: Variables
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
  }
}

# Avoid: Hardcoded values
query {
  user(id: "123") {
    id
    name
  }
}

4. Colocate Fragments with Components

// UserAvatar.tsx
export const USER_AVATAR_FRAGMENT = gql`
  fragment UserAvatar on User {
    id
    name
    avatarUrl
  }
`;

function UserAvatar({ user }) {
  return <img src={user.avatarUrl} alt={user.name} />;
}

Reference Files

Detailed documentation for specific topics:

  • Queries - Query patterns and optimization
  • Mutations - Mutation patterns and error handling
  • Fragments - Fragment organization and reuse
  • Variables - Variable usage and types
  • Tooling - Code generation and linting

Ground Rules

  • ALWAYS read the project's schema first, and use only the fields, arguments, and enum values it defines
  • ALWAYS name your operations (no anonymous queries/mutations)
  • ALWAYS use variables for dynamic values
  • ALWAYS request only the fields you need
  • ALWAYS include id field for cacheable types
  • NEVER hardcode values in operations
  • NEVER duplicate field selections across files
  • PREFER fragments for reusable field selections
  • PREFER colocating fragments with components
  • USE descriptive operation names that reflect purpose
  • USE @include/@skip for conditional fields

Больше 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-schema
apollographql
Руководство по лучшим практикам отрасли для проектирования интуитивно понятных, производительных и поддерживаемых GraphQL-схем. Охватывает основные принципы проектирования, включая клиенто-ориентированную организацию
rover
apollographql
Apollo Rover CLI для управления схемами GraphQL, федерацией и локальной разработкой суперграфа. Публикация, получение и проверка схем подграфов; компоновка федеративных суперграфов локально или через GraphOS. Включает проверку схем (валидацию перед развёртыванием), линтинг и интроспекцию запущенных серверов. Команда rover dev запускает локальный Router с автоматической компоновкой схем для рабочих процессов разработки. Поддерживает CI/CD с проверкой перед публикацией и выводом в JSON для скриптов.
rust-best-practices
apollographql
Идиоматические стандарты кодирования Rust на основе руководства по лучшим практикам Apollo GraphQL. Охватывает девять ключевых областей: стили и идиомы кодирования, линтинг clippy, оптимизация производительности, обработка ошибок, шаблоны тестирования, обобщения и диспетчеризация, шаблон конечного автомата, документация и безопасность указателей. Уделяет особое внимание заимствованию вместо клонирования, обработке ошибок на основе Result с thiserror/anyhow и профилированию производительности с помощью релизных сборок. Включает краткое справочное руководство по шаблонам владения, избеганию паник,...