graphql-operations

Panduan praktik terbaik untuk menulis operasi GraphQL yang efisien dan aman tipe serta mengaturnya dengan fragmen. Mencakup kueri, mutasi, langganan, dan fragmen dengan konvensi penamaan, sintaks variabel, dan penggunaan direktif. Menekankan prinsip inti: hanya meminta bidang yang diperlukan, beri nama semua operasi, gunakan variabel alih-alih nilai hardcoded, dan sertakan bidang id untuk cacheability. Merekomendasikan penempatan fragmen bersama komponen dan menggunakan direktif @include / @skip untuk bidang kondisional...

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

Lebih banyak skill dari apollographql

apollo-federation
apollographql
Apollo Federation memungkinkan penggabungan beberapa API GraphQL (subgraf) menjadi satu supergraf yang terpadu.
apollo-ios
apollographql
Apollo iOS adalah klien GraphQL yang diketik secara kuat untuk platform Apple. Ia menghasilkan tipe Swift dari operasi dan skema GraphQL Anda, serta menyertakan klien async/await, cache yang dinormalisasi (berbasis memori atau SQLite), transport HTTP berbasis interceptor yang dapat dipasang untuk menangani kueri, mutasi, dan langganan multipart, serta transport WebSocket opsional (graphql-transport-ws) yang dapat membawa jenis operasi apa pun.
apollo-router
apollographql
Apollo Router adalah router graf berkinerja tinggi yang ditulis dalam Rust untuk menjalankan supergraf Apollo Federation 2. Router ini berada di depan subgraf Anda dan menangani perencanaan kueri, eksekusi, serta komposisi respons.
apollo-router-plugin-creator
apollographql
Buat plugin Rust asli untuk Apollo Router.
apollo-server
apollographql
Panduan lengkap untuk membangun server GraphQL dengan Apollo Server 5.x di berbagai framework. Mencakup definisi skema, resolver, pengaturan konteks, dan penanganan kesalahan dengan dukungan TypeScript. Mendukung mode mandiri untuk pembuatan prototipe dan integrasi dengan Express, Fastify, Koa, serta lingkungan serverless. Termasuk pola resolver, autentikasi/otorisasi, plugin, DataLoader untuk pencegahan N+1, dan teknik optimasi kinerja. Menyediakan dokumentasi referensi untuk sumber data, kesalahan...
graphql-schema
apollographql
Panduan praktik terbaik industri untuk merancang skema GraphQL yang intuitif, berperforma tinggi, dan mudah dipelihara. Mencakup prinsip desain inti termasuk organisasi tipe yang berpusat pada klien, pola nullability eksplisit, dan strategi evolusi yang kompatibel ke belakang. Menyediakan dokumentasi referensi tentang tipe, konvensi penamaan, pagination berbasis kursor, pemodelan kesalahan, dan pertimbangan keamanan. Mencakup pola praktis untuk antarmuka, union, tipe input, mutasi, dan strategi ID dengan contoh kode...
rover
apollographql
CLI Apollo Rover untuk mengelola skema GraphQL, federasi, dan pengembangan supergraph lokal. Publikasikan, ambil, dan validasi skema subgraph; buat supergraph terfederasi secara lokal atau melalui GraphOS. Termasuk pemeriksaan skema (validasi pra-deploy), linting, dan introspeksi dari server yang berjalan. Perintah rover dev memulai Router lokal dengan komposisi skema otomatis untuk alur kerja pengembangan. Mendukung pola CI/CD dengan validasi periksa-sebelum-publikasi dan output JSON untuk skrip. Memerlukan...
rust-best-practices
apollographql
Standar pengkodean Rust idiomatik berdasarkan buku pedoman praktik terbaik Apollo GraphQL. Mencakup sembilan area inti: gaya dan idiom pengkodean, linting clippy, optimasi kinerja, penanganan error, pola pengujian, generik dan dispatch, pola state tipe, dokumentasi, dan keamanan pointer. Menekankan peminjaman daripada kloning, penanganan error berbasis Result dengan thiserror/anyhow, dan profiling kinerja dengan build rilis. Termasuk panduan referensi cepat tentang pola kepemilikan, penghindaran panic,...