graphql-operations

Guia de melhores práticas para escrever operações GraphQL eficientes e type-safe, organizando-as com fragments. Aborda queries, mutations, subscriptions e fragments com convenções de nomenclatura, sintaxe de variáveis e uso de diretivas. Enfatiza princípios fundamentais: solicitar apenas os campos necessários, nomear todas as operações, usar variáveis em vez de valores fixos e incluir campos de id para capacidade de cache. Recomenda colocar fragments junto com componentes e usar as diretivas @include / @skip para campos condicionais...

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

Mais skills de apollographql

apollo-federation
apollographql
O Apollo Federation permite compor múltiplas APIs GraphQL (subgrafos) em um supergrafo unificado.
apollo-ios
apollographql
Apollo iOS é um cliente GraphQL fortemente tipado para plataformas Apple. Ele gera tipos Swift a partir das suas operações e schema GraphQL, e inclui um cliente async/await, um cache normalizado (em memória ou com suporte a SQLite), um transporte HTTP baseado em interceptadores plugáveis que lida com queries, mutations e assinaturas multipart, e um transporte WebSocket opcional (graphql-transport-ws) que pode transportar qualquer tipo de operação.
apollo-router
apollographql
O Apollo Router é um roteador de grafos de alto desempenho escrito em Rust para executar supergrafos do Apollo Federation 2. Ele fica na frente dos seus subgrafos e lida com planejamento de consultas, execução e composição de respostas.
apollo-router-plugin-creator
apollographql
Crie plugins nativos em Rust para o Apollo Router.
apollo-server
apollographql
Guia completo para construir servidores GraphQL com Apollo Server 5.x em diferentes frameworks. Aborda definição de esquemas, resolvers, configuração de contexto e tratamento de erros com suporte a TypeScript. Suporta modo standalone para prototipagem e integrações com Express, Fastify, Koa e ambientes serverless. Inclui padrões de resolvers, autenticação/autorização, plugins, DataLoader para prevenção de N+1 e técnicas de otimização de desempenho. Fornece documentação de referência para fontes de dados, erros...
graphql-schema
apollographql
Guia de melhores práticas da indústria para projetar schemas GraphQL intuitivos, performáticos e de fácil manutenção. Aborda princípios fundamentais de design, incluindo organização de tipos centrada no cliente, padrões explícitos de nulidade e estratégias de evolução com compatibilidade reversa. Fornece documentação de referência sobre tipos, convenções de nomenclatura, paginação baseada em cursor, modelagem de erros e considerações de segurança. Inclui padrões práticos para interfaces, uniões, tipos de entrada, mutações e estratégias de ID com exemplos de código...
rover
apollographql
CLI Apollo Rover para gerenciar esquemas GraphQL, federação e desenvolvimento local de supergraph. Publique, busque e valide esquemas de subgraph; componha supergraphs federados localmente ou via GraphOS. Inclui verificação de esquema (validação pré-implantação), linting e introspecção de servidores em execução. O comando rover dev inicia um Router local com composição automática de esquema para fluxos de desenvolvimento. Suporta padrões de CI/CD com validação check-before-publish e saída JSON para scripts. Requer...
rust-best-practices
apollographql
Padrões de codificação idiomáticos em Rust baseados no manual de melhores práticas da Apollo GraphQL. Abrange nove áreas principais: estilos e expressões idiomáticas de codificação, linting com clippy, otimização de desempenho, tratamento de erros, padrões de teste, genéricos e dispatch, padrão de estado de tipo, documentação e segurança de ponteiros. Enfatiza borrowing em vez de clonagem, tratamento de erros baseado em Result com thiserror/anyhow e perfilamento de desempenho com builds de release. Inclui orientação de referência rápida sobre padrões de ownership, prevenção de pânicos,...