graphql
/graphql
Doradza w architekturze GraphQL: schemat SDL, projekt resolverów, batching DataLoader, federacja i cache klienta, w tym unikanie problemu N+1 w Apollo i Relay.
- Autor
- G1Joshi ↗
- Repozytorium
- Agent-Skills ↗
- Licencja
- MIT
- Ostatnia zmiana repozytorium
- 01.10.2026
Ocena i bezpieczeństwo
- Pliki w paczce
- 1
- Skrypty
- 0
- Komentarze HTML
- 0
- Adresy URL w SKILL.md
- 2
Brak sygnałów. Repozytorium zmienione 01.10.2026, bez odwołań do wycofanych modeli i API.
MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.
Co robi i kiedy
Doradza w architekturze GraphQL: schemat SDL, projekt resolverów, batching DataLoader, federacja i cache klienta, w tym unikanie problemu N+1 w Apollo i Relay.
Oryginalny opis (EN)
Expert GraphQL architecture assistance covering schema definition language (SDL), resolver design, DataLoader batching, schema stitching/federation, and client caching. Use when designing GraphQL APIs, preventing N+1 query problems, building Apollo/Relay schemas, or aggregating data from multiple services.
Jak działa
- When to Use
- Quick Start
- Core Concepts
- Common Patterns
- Best Practices
- Troubleshooting
- References
Podgląd SKILL.md
---
name: graphql
description: Expert GraphQL architecture assistance covering schema definition language (SDL), resolver design, DataLoader batching, schema stitching/federation, and client caching. Use when designing GraphQL APIs, preventing N+1 query problems, building Apollo/Relay schemas, or aggregating data from multiple services.
---
# GraphQL
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. It gives clients the power to ask for exactly what they need and nothing more.
## When to Use
- **Client-Driven Data Fetching**: Web and mobile clients with drastically different UI layout requirements consuming the same API.
- **Over-Fetching & Under-Fetching Mitigation**: Allowing clients to request the exact fields needed for a view in a single HTTP request.
- **API Aggregation & Federated Supergraphs**: Combining dozens of microservice APIs into a unified GraphQL schema via Apollo Federation.
- **Real-Time Subscriptions**: Streaming live changes to clients over WebSockets or HTTP Server-Sent Events (SSE).
## Quick Start
```graphql
# The Schema
type User {
id: ID!
name: String!
orders: [Order]
}
type Query {
user(id: ID!): User
}
```
```javascript
// The Query (Client)
query {
user(id: "123") {
name
orders {
total
status
}
}
}
```
## Core Concepts
### Strongly-Typed Schema Definition (SDL)
Defines types, relationships, queries, and mutations strictly:
```graphql
# schema.graphql
type Query {
project(id: ID!): Project
}
type Mutation {
assignTask(input: AssignTaskInput!): Task!
}
type Project {
id: ID!
name: String!
tasks(status: TaskStatus): [Task!]!
}
type Task {
id: ID!
title: String!
assignee: User
}
```
### Resolvers & Hierarchical Execution
Each field on a type maps to an independent resolver function:
```typescript
// resolvers.ts
export const resolvers = {
Query: {
project: async (_parent, { id }, ctx) => ctx.db.getProject(id),
},
Project: {
// Resolved only if the client requested the "tasks" field
tasks: async (project, { status }, ctx) =>
ctx.db.getTasksForProject(project.id, status),
},
};
```
### DataLoader Request Batching & Deduplication
Batches individual resolver database lookups into a single SQL `IN` query to prevent N+1 query storms:
```typescript
import DataLoader from "dataloader";
export function createUserDataLoader(db: Database) {
return new DataLoader(async (userIds: readonly string[]) => {
const users = await db.query("SELECT * FROM users WHERE id = ANY($1)", [
userIds,
]);
const userMap = new Map(users.map((u) => [u.id, u]));
return userIds.map((id) => userMap.get(id) || null);
});
}
```
## Common Patterns
### DataLoader N+1 Query Prevention
**Problem**: Nested resolvers trigger separate SQL queries for each child record (N+1 database reads).
**Solution**: Batch and cache database reads using DataLoader.
```typescript
import DataLoader from "dataloader";
// Batch function receives array of IDs collected across concurrent resolvers
const authorLoader = new DataLoader(async (authorIds: readonly string[]) => {
const authors = await db
.select()
.from(authorsTable)
.where(inArray(authorsTable.id, authorIds as string[]));
const authorMap = new Map(authors.map((a) => [a.id, a]));
return authorIds.map((id) => authorMap.get(id) || null);
});
// Resolver consumes DataLoader
export const resolvers = {
Book: {
author: (book: { authorId: string }) => authorLoader.load(book.authorId),
},
};
```
## Best Practices
**Do**:
- Always Use DataLoader for Relational Fields: Never allow nested child resolvers to execute raw database queries in a loop.
- Implement Query Complexity Limits: Use libraries like `graphql-query-complexity` to reject nested query abuse before execution.
- Paginate List Fields with Cursors: Follow the Relay Connection specification (`edges`, `node`, `pageInfo`) for robust infinite scroll.
- Persist Queries in Production: Use Persisted Queries (hashes) to prevent arbitrary unbounded query submission from untrusted clients.
**Don't**:
- Expose internal database schemas directly as GraphQL types: Design domain schemas optimized for frontend views.
- Return generic HTTP 500 errors for business failures: Return structured validation errors inside GraphQL response payloads.
- Ignore HTTP caching: GraphQL POST requests bypass browser caches; use CDN Edge caching with Cache-Control headers.
## Troubleshooting
| Error | Cause | Solution |
| :------------------- | :------------------------ | :----------------------------------------------------- |
| `Cannot query field` | Typo or field restricted. | Check Schema and Introspection. |
| `N+1 Performance` | Slow response on lists. | Implement DataLoader. |
| `Caching` | Hard to cache via HTTP. | Use Normalized Caching in Client (Apollo Client/Urql). |
## References
- [GraphQL.org](https://graphql.org/)
- [Apollo GraphQL](https://www.apollographql.com/)
Wersje
| Repozytorium | Wynik | Licencja |
|---|---|---|
| Ta strona · G1Joshi/Agent-Skills | 100 | MIT |
| TerminalSkills/skills | 100 | Apache-2.0 |
| nimadorostkar/Claude-Skills-collection | 100 | MIT |
| crowdin/skills | 100 | MIT |
| claude-dev-suite/claude-dev-suite | 100 | MIT |
| muon-m2/magento2-tools | 100 | MIT |
| chrishuffman5/domain-expert | 100 | MIT |
| arbazkhan971/godmode | 100 | MIT |
| Tyler-R-Kendrick/agent-skills | 100 | MIT |
Migawka bazy z 28.10.2026 · wersja paczki ef70b96e2f53 (skrót SHA-256 całej paczki)
Pobrania w ostatnich 30 dniach: 0 · ranking
Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.
Podobne skille
- 100graphql-architect
Wspiera projektowanie schematów GraphQL, wdrażanie Apollo Federation i subskrypcji czasu rzeczywistego, resolvery z DataLoader, optymalizację zapytań oraz dyrektywy federacji. - 100graphql-expert
Wspiera tworzenie API GraphQL na poziomie eksperckim: projekt schematu, resolvery, subskrypcje, Apollo Server 4 i DataLoader przeciw problemowi N+1. - 95graphql-resolvers
Pomaga implementować resolvery GraphQL: funkcje resolverów, kontekst, batching DataLoader, obsługę błędów, uwierzytelnianie i strategie testowania. - 95api-graphql-grpc
Projektuje schematy GraphQL, resolvery, wzorce query, mutation i subscription oraz definicje protobuf dla usług gRPC, w tym DataLoader i wybór między GraphQL, REST i gRPC. - 100graphql-api-design
Projektuje API GraphQL z dobrze ułożonymi schematami, wydajnymi resolverami, paginacją oraz wzorcami wydajności takimi jak DataLoader i federacja. - 91apollo-server-patterns
Pomaga budować API GraphQL w Apollo Server: resolvery, źródła danych, projekt schematu i federację.