graphql-operations

Leitfaden für Best Practices zum Schreiben effizienter, typsicherer GraphQL-Operationen und deren Organisation mit Fragmenten. Behandelt Queries, Mutationen, Subscriptions und Fragmente mit Namenskonventionen, Variablensyntax und Direktivenverwendung. Betont Kernprinzipien: nur benötigte Felder anfordern, alle Operationen benennen, Variablen statt hartcodierter Werte verwenden und ID-Felder für die Cache-Fähigkeit einfügen. Empfiehlt, Fragmente mit Komponenten zu kollokieren und @include-/@skip-Direktiven für bedingte Felder zu nutzen...

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.

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 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

Mehr Skills von apollographql

apollo-client
apollographql
Apollo Client ist eine umfassende Zustandsverwaltungsbibliothek für JavaScript, die es Ihnen ermöglicht, sowohl lokale als auch entfernte Daten mit GraphQL zu verwalten. Version 4.x bietet verbessertes Caching, bessere TypeScript-Unterstützung und Kompatibilität mit React 19.
official
apollo-client
apollographql
Umfassender Leitfaden zum Erstellen von React-Anwendungen mit Apollo Client 4.x, der Abfragen, Mutationen, Caching und Zustandsverwaltung abdeckt. Unterstützt mehrere React-Frameworks und -Setups: clientseitige Apps (Vite, CRA), Next.js App Router mit React Server Components, React Router 7 mit Streaming SSR und TanStack Start. Enthält Hooks für Abfragen (useQuery, useLazyQuery), Mutationen (useMutation) und Suspense-basierte Muster (useSuspenseQuery, useBackgroundQuery) für modernes React 18+ und 19...
official
apollo-connectors
apollographql
Integrieren Sie REST-APIs in GraphQL-Supergraphen mithilfe der @source- und @connect-Direktiven. Bietet einen strukturierten 5-Schritte-Prozess: API-Struktur analysieren, Schema mit Direktiven implementieren, via rover supergraph compose validieren, Connectors ausführen und Abdeckung testen. Unterstützt Anfragekonfiguration einschließlich Headern, Body-Payloads, Batching für N+1-Muster und Umgebungsvariablen-Injektion via $env. Behandelt Antwort-Mapping mit Feldauswahl, Aliasing, Unterauswahlen für verschachtelte Daten und Entitäten...
official
apollo-federation
apollographql
Apollo Federation ermöglicht das Zusammenführen mehrerer GraphQL-APIs (Subgraphen) zu einem einheitlichen Supergraphen.
official
apollo-ios
apollographql
Apollo iOS ist ein stark typisierter GraphQL-Client für Apple-Plattformen. Er generiert Swift-Typen aus Ihren GraphQL-Operationen und Ihrem Schema und enthält einen Async/Await-Client, einen normalisierten Cache (im Arbeitsspeicher oder SQLite-gestützt), einen steckbaren, auf Interceptoren basierenden HTTP-Transport, der Abfragen, Mutationen und Multipart-Abonnements verarbeitet, sowie einen optionalen WebSocket-Transport (graphql-transport-ws), der jeden Operationstyp übertragen kann.
official
apollo-kotlin
apollographql
Apollo Kotlin ist ein stark typisierter GraphQL-Client, der aus Ihren GraphQL-Operationen und Ihrem Schema Kotlin-Modelle generiert, die in Android-, JVM- und Kotlin-Multiplatform-Projekten verwendet werden können.
official
apollo-mcp-server
apollographql
Verbinde KI-Agenten über das Model Context Protocol mit GraphQL-APIs, inklusive integrierter Introspections- und Operationstools. Stellt GraphQL-Operationen als MCP-Tools bereit; unterstützt drei Operationsquellen: lokale Dateien, GraphOS Studio-Sammlungen und persistierte Query-Manifeste. Bietet vier Introspection-Tools (introspect, search, validate, execute) zur Schemaerkundung und Ad-hoc-Query-Tests; der Minifizierungsmodus reduziert Token-Nutzung durch kompakte Notation. Konfigurierbare Authentifizierung über statische Header,...
official
apollo-router
apollographql
Apollo Router ist ein leistungsstarker Graph-Router, der in Rust geschrieben wurde und für den Betrieb von Apollo Federation 2-Supergraphen entwickelt wurde. Er sitzt vor Ihren Subgraphen und übernimmt die Abfrageplanung, -ausführung und Antwortkomposition.
official