Gernar
Frontend DeveloperHTTP, API и сеть

Интервью-вопрос

Что такое GraphQL

GraphQL это способ строить API через типизированную схему, где клиент описывает нужные поля ответа. Для frontend-разработчика главное понимать пользу для экранов, обработку ошибок и риски производительности.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Как лучше коротко объяснить GraphQL?

Вы отвечаете на базовый вопрос. Важно не перепутать GraphQL с базой данных или библиотекой клиента.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

GraphQL нужен, чтобы вы могли описать форму данных для конкретного экрана. В REST вы часто ходите в несколько endpoint-ов или получаете объект с лишними полями. В GraphQL вы отправляете операцию, а сервер исполняет ее по схеме.

Простой пример запроса:

query UserProfile($id: ID!) {
  user(id: $id) {
    id
    name
    avatarUrl
    posts(first: 3) {
      id
      title
    }
  }
}

Такой запрос явно говорит, что экрану профиля нужны имя, аватар и 3 последних поста. Если компоненту не нужен email, его не стоит запрашивать. Так вы снижаете лишний трафик и делаете зависимость UI от данных более явной.

Из чего состоит ответ на интервью

Хороший короткий ответ можно построить так:

  1. Дайте определение: GraphQL это язык запросов и runtime для API.
  2. Объясните схему: она описывает типы, поля, аргументы и доступные операции.
  3. Назовите операции: query для чтения, mutation для изменения, subscription для обновлений.
  4. Добавьте frontend-вывод: можно запрашивать только нужные поля, генерировать типы и аккуратно работать с кэшем.
  5. Покажите ограничение: производительность, авторизация и ошибки не решаются автоматически.

Пример формулировки:

GraphQL это способ описывать запросы к API через типизированную схему. Клиент сам выбирает поля, которые нужны экрану, а сервер валидирует и исполняет запрос. Для фронтенда это удобно, потому что можно уменьшить лишние данные и получить типы из схемы, но нужно помнить про кэш, частичные ошибки и тяжелые вложенные запросы.

Когда GraphQL действительно полезен

GraphQL особенно хорошо подходит, когда один экран собирает данные из нескольких связанных сущностей. Например, профиль пользователя может показывать данные пользователя, настройки, последние посты, счетчики и права доступа. Вместо нескольких ручных запросов вы описываете одну операцию под экран.

Но это не значит, что GraphQL нужен везде. Если API простой, команда уже хорошо поддерживает REST, а форма данных почти не меняется, переход может добавить больше процессов, чем пользы. На интервью лучше не противопоставлять подходы резко. Сильнее звучит ответ, где вы говорите про критерии выбора.

Как выбрать между GraphQL и более простым API

1Экран собирает данные из нескольких связанных сущностей?
GraphQL может сократить число ручных запросов и дать удобную форму ответа.
2API простое и почти всегда возвращает один ресурс?
REST может быть дешевле и понятнее, особенно если команда уже хорошо его поддерживает.
3Нужны строгие типы между backend и frontend?
GraphQL-схема и codegen хорошо помогают, если команда следит за совместимостью схемы.
4Есть риск тяжелых вложенных запросов?
Нужны лимиты, батчинг, кэш и договоренности по запросам. Иначе клиент легко создаст дорогой сценарий.

Что важно для frontend-разработчика

На фронтенде GraphQL обычно влияет на три вещи: типы, кэш и состояние загрузки. Схема позволяет генерировать TypeScript-типы для запросов. Это снижает риск опечаток в полях и помогает заметить breaking change раньше, чем пользователь увидит пустой экран.

Кэш сложнее, чем может показаться. GraphQL-клиенты часто нормализуют данные по id и __typename. Если в ответе нет стабильного идентификатора, клиенту сложнее обновлять данные после mutation. В итоге UI может показать устаревшее состояние.

Ошибки тоже требуют внимания. GraphQL-ответ может быть частично успешным:

{
  "data": {
    "user": {
      "id": "1",
      "name": "Ada",
      "billingInfo": null
    }
  },
  "errors": [
    {
      "message": "Billing service is unavailable",
      "path": ["user", "billingInfo"]
    }
  ]
}

Безопасный UI не должен просто падать или показывать общий пустой экран. Можно показать профиль, отдельно подсветить недоступный блок биллинга и дать пользователю понятное сообщение.

UI-состояние, refetch и гонки

В React важно связывать результат GraphQL-запроса с текущими variables и жизненным циклом экрана. Опасный паттерн выглядит так. Пользователь меняет фильтр или переходит на другой профиль, а старый ответ приходит позже и перезаписывает state. В итоге UI показывает данные не для текущего маршрута или фильтра.

Безопаснее использовать возможности GraphQL-клиента: статус initial loading отдельно от refetch, dedupe одинаковых операций, abort или игнорирование устаревшего ответа. Если вы пишете загрузку вручную через fetch, проверяйте актуальные variables перед записью в state и очищайте эффект при размонтировании компонента.

Empty state тоже должен быть отдельным состоянием. Пустой список после успешного запроса, ошибка сети и частичная ошибка поля требуют разных сообщений. Иначе пользователь не поймет, данных правда нет или экран сломался.

Мутации и обновление UI

Для изменения данных в GraphQL используют mutation. Важно не только отправить данные, но и запросить в ответе поля, которые нужны для обновления UI и кэша.

mutation RenameProject($id: ID!, $name: String!) {
  renameProject(id: $id, name: $name) {
    id
    name
    updatedAt
  }
}

Если mutation вернет только true, фронтенду придется угадывать новое состояние или делать лишний refetch. Если вернуть измененную сущность с идентификатором, клиентскому кэшу проще обновить экран. При optimistic UI нужен rollback на ошибку, иначе пользователь увидит изменение, которое сервер не сохранил.

Главные ограничения и риски

GraphQL дает клиенту гибкость, но эта гибкость может стать проблемой. Глубокий запрос может пройти по длинной цепочке связей и создать большую нагрузку на сервер. Поэтому на production API обычно нужны лимиты глубины и сложности, таймауты, батчинг резолверов и мониторинг медленных операций.

Еще один риск связан с безопасностью. Нельзя думать, что если поле есть в схеме, его можно отдавать всем. Авторизация должна проверяться на уровне операций и данных. Иначе пользователь может запросить поле, которое UI обычно не показывает, но схема разрешает. Скрыть поле в компоненте недостаточно.

На клиенте данные из GraphQL все равно остаются внешними данными. Не вставляйте HTML из ответа через dangerouslySetInnerHTML без надежной очистки, не храните секреты в query или variables и не логируйте токены вместе с телом запроса. Безопаснее передавать авторизацию обычным защищенным механизмом приложения и показывать только данные, которые сервер уже проверил.

Для публичных API часто используют persisted queries или allowlist операций. Это помогает контролировать, какие запросы реально исполняются, и снижает риск дорогих или неожиданных запросов от клиента.

Практический вывод

Если вас спрашивают про GraphQL, не ограничивайтесь фразой про запрос только нужных данных. Добавьте, как это влияет на работу frontend-команды: типы из схемы, меньше ручной склейки данных, более явный контракт экрана, но более сложный кэш и обработка ошибок.

Спокойная сильная позиция звучит так: GraphQL хорош для сложных интерфейсов с разными наборами данных и активным развитием продукта. REST остается нормальным выбором для простых ресурсов, загрузки файлов, публичного кэширования через HTTP и случаев, где гибкая форма ответа не нужна.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Называть GraphQL заменой базы данных

    GraphQL не хранит данные сам по себе. Он описывает контракт API и исполняет запросы через серверные резолверы, которые уже обращаются к базам, сервисам или другим API. На интервью лучше сказать, что это слой между клиентом и источниками данных.

  2. 2

    Говорить, что GraphQL всегда быстрее REST

    Меньший payload не гарантирует быстрый ответ. Глубокий запрос может вызвать много резолверов, N+1 и долгую загрузку экрана. Безопаснее сказать, что GraphQL дает клиенту гибкость, но производительность зависит от схемы, сервера, кэша и контроля сложности.

  3. 3

    Проверять только HTTP-статус

    GraphQL-ответ может прийти с data и errors одновременно. Если UI смотрит только на response.ok, он может показать неполные данные как успешный экран. Нужна отдельная обработка сетевых ошибок, ошибок GraphQL и частичных данных.

  4. 4

    Запрашивать все поля на всякий случай

    Так вы теряете главное преимущество GraphQL и создаете лишнюю нагрузку на сеть и сервер. На фронтенде запрос должен соответствовать данным конкретного экрана. Общие части лучше выносить во фрагменты, но не превращать их в огромный универсальный запрос.

  5. 5

    Забывать про версионирование схемы

    В GraphQL часто не заводят версии URL, поэтому совместимость держится на схеме. Удаление или переименование поля может сломать старый клиент. Лучше использовать deprecation, метрики использования полей и проверку запросов в CI.

  6. 6

    Не учитывать гонки запросов в UI

    Если пользователь быстро меняет фильтр, вкладку или маршрут, старый GraphQL-ответ может прийти позже нового и перезаписать экран неактуальными данными. Безопаснее отменять запрос, игнорировать ответ с устаревшими variables или использовать возможности клиента для dedupe, abort и корректного refetch-состояния.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание GraphQL, схемы, ошибок и практики frontend-разработки.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание