graphql-operations

作成者: apollographql

効率的で型安全な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

apollographqlのその他のスキル

apollo-federation
apollographql
Apollo Federationは、複数のGraphQL API(サブグラフ)を統合されたスーパーグラフに構成することを可能にします。
apollo-ios
apollographql
Apollo iOSは、Appleプラットフォーム向けの強く型付けされたGraphQLクライアントです。GraphQLの操作とスキーマからSwiftの型を生成し、async/awaitクライアント、正規化キャッシュ(インメモリまたはSQLite対応)、クエリ、ミューテーション、マルチパートサブスクリプションを処理するプラグ可能なインターセプターベースのHTTPトランスポート、および任意の操作タイプを伝送可能なオプションのWebSocketトランスポート(graphql-transport-ws)を搭載しています。
apollo-router
apollographql
Apollo Routerは、Apollo Federation 2のスーパーグラフを実行するためにRustで書かれた高性能なグラフルーターです。サブグラフの前に配置され、クエリの計画、実行、レスポンスの合成を処理します。
apollo-router-plugin-creator
apollographql
Apollo Router用のネイティブRustプラグインを作成します。
apollo-server
apollographql
Apollo Server 5.xを使用してフレームワーク間でGraphQLサーバーを構築するための完全ガイド。スキーマ定義、リゾルバ、コンテキスト設定、TypeScriptサポートによるエラーハンドリングを網羅。プロトタイピング用のスタンドアロンモードと、Express、Fastify、Koa、サーバーレス環境との統合をサポート。リゾルバパターン、認証/認可、プラグイン、N+1問題防止のためのDataLoader、パフォーマンス最適化手法を含む。データソース、エラー...のリファレンスドキュメントを提供。
graphql-schema
apollographql
直感的で高性能かつ保守可能なGraphQLスキーマを設計するための業界ベストプラクティスガイド。クライアント中心の型構成、明示的なnull許容パターン、後方互換性のある進化戦略を含む中核設計原則を網羅。型、命名規則、カーソルベースのページネーション、エラーモデリング、セキュリティ考慮事項に関するリファレンスドキュメントを提供。インターフェース、ユニオン、入力型、ミューテーション、ID戦略に関する実践的なパターンをコード例とともに収録...
rover
apollographql
Apollo Rover CLIは、GraphQLスキーマ、フェデレーション、ローカルスーパーグラフ開発を管理するためのツールです。サブグラフスキーマの公開、取得、検証、フェデレーテッドスーパーグラフのローカルまたはGraphOS経由での構成を行います。スキーマチェック(デプロイ前検証)、リンティング、実行中のサーバーからのイントロスペクションを含みます。rover devコマンドは、開発ワークフロー向けに自動スキーマ構成を備えたローカルRouterを起動します。公開前チェック検証とスクリプト用のJSON出力を備えたCI/CDパターンをサポートします。必須条件...
rust-best-practices
apollographql
Apollo GraphQLのベストプラクティスハンドブックに基づく慣用的なRustコーディング標準。9つの主要領域をカバー:コーディングスタイルとイディオム、clippyリンティング、パフォーマンス最適化、エラーハンドリング、テストパターン、ジェネリクスとディスパッチ、タイプステートパターン、ドキュメンテーション、ポインタ安全性。クローンよりも借用を重視し、thiserror/anyhowを用いたResultベースのエラーハンドリング、リリースビルドでのパフォーマンスプロファイリングを強調。所有権パターン、パニック回避に関するクイックリファレンスガイダンスを含む...