Учебник GraphQL с нуля для начинающих
GraphQL — это язык запросов к API, в котором клиент сам выбирает нужные поля, а сервер отдаёт ровно их. В этом курсе мы пройдём путь с нуля: от различий с REST до зрелой продакшен-схемы.
Ты разберёшь схему и систему типов, научишься писать запросы, мутации и подписки, поймёшь, как работают резолверы и сервер на Apollo Server 4, и решишь главную боль производительности — проблему N+1 — с помощью DataLoader. Много запускаемых примеров на чистом JavaScript, ASCII-диаграмм и практик 2024-2025 годов.
Курс «GraphQL с нуля» состоит из 6 разделов и 19 уроков: Введение и GraphQL vs REST, Схема и типы, Запросы и аргументы, Мутации и подписки, Резолверы и сервер и Клиент и оптимизация N+1. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение и GraphQL vs REST
- Что такое GraphQL и зачем он нужен
Простое объяснение, что такое GraphQL: язык запросов к API, единая точка входа и клиент, который сам решает, какие данные ему нужны.
- GraphQL vs REST: over-fetching и under-fetching
Чем GraphQL отличается от REST: проблемы лишних и недостающих данных, число запросов, кэширование и честное сравнение подходов.
- Единый эндпоинт и анатомия запроса
Как устроен GraphQL-запрос: один эндпоинт, три типа операций, поля, аргументы и форма ответа data/errors.
- Что такое GraphQL и зачем он нужен
2 Схема и типы
- Схема и SDL: контракт между клиентом и сервером
Что такое GraphQL-схема и язык SDL: типы, поля, корневые типы Query и Mutation как строгий контракт API.
- Скаляры, объекты и перечисления
Базовые строительные блоки типов GraphQL: встроенные скаляры Int, Float, String, Boolean, ID, объектные типы, enum и кастомные скаляры.
- Nullability и списки: ! и [Type!]!
Модификаторы типов в GraphQL: восклицательный знак для non-null, квадратные скобки для списков и как читать сложные сигнатуры вроде [User!]!.
- Схема и SDL: контракт между клиентом и сервером
3 Запросы и аргументы
- Поля, вложенность и обход дерева запроса
Как устроен запрос GraphQL: поля, вложенные выборки, путешествие по графу связанных типов за один запрос.
- Аргументы, переменные и алиасы
Как параметризовать запросы GraphQL: аргументы полей, типизированные переменные и алиасы для повторного запроса одного поля.
- Фрагменты и директивы
Переиспользование выборок через фрагменты и условная выборка полей с директивами @include и @skip в GraphQL.
- Поля, вложенность и обход дерева запроса
4 Мутации и подписки
- Мутации: изменяем данные
Как изменять данные в GraphQL: тип Mutation, операции создания, обновления и удаления, возврат изменённого объекта.
- Input-типы и обработка ошибок мутаций
Структурирование аргументов мутаций через input-типы и паттерн payload-результата с полями errors для понятной обработки ошибок.
- Подписки и реальное время
Третий тип операций GraphQL — подписки: поток событий через постоянное соединение, когда они нужны и как устроены.
- Мутации: изменяем данные
5 Резолверы и сервер
- Что такое резолвер: четыре аргумента
Анатомия резолвера в GraphQL: parent, args, context, info — как функция-резолвер достаёт данные для каждого поля.
- Собираем сервер на Apollo Server 4
Минимальный GraphQL-сервер на Apollo Server 4: typeDefs, resolvers, запуск через startStandaloneServer и Playground.
- Контекст и авторизация в резолверах
Как использовать context для аутентификации и авторизации в GraphQL: проверка прав в резолверах и защита полей.
- Что такое резолвер: четыре аргумента
6 Клиент и оптимизация N+1
- Проблема N+1: откуда берётся
Что такое проблема N+1 в GraphQL: как вложенные резолверы над списками порождают лавину запросов в базу данных.
- DataLoader: батчинг и кэширование
Как DataLoader решает проблему N+1 в GraphQL: батчинг вызовов load в один запрос и кэширование в пределах запроса.
- Клиент: Apollo Client и кэш
GraphQL на фронтенде: Apollo Client, нормализованный кэш, переменные и почему кэширование сложнее, чем в REST.
- Best practices и эволюция схемы
Итоговые практики GraphQL: пагинация, безопасная эволюция схемы через @deprecated, защита от тяжёлых запросов и безопасность.
- Проблема N+1: откуда берётся