Интервью-вопрос
Что такое GraphQL
GraphQL это способ строить API через типизированную схему, где клиент описывает нужные поля ответа. Для frontend-разработчика главное понимать пользу для экранов, обработку ошибок и риски производительности.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 60 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
GraphQL нужен, чтобы вы могли описать форму данных для конкретного экрана. В REST вы часто ходите в несколько endpoint-ов или получаете объект с лишними полями. В GraphQL вы отправляете операцию, а сервер исполняет ее по схеме.
Простой пример запроса:
query UserProfile($id: ID!) {
user(id: $id) {
id
name
avatarUrl
posts(first: 3) {
id
title
}
}
}Такой запрос явно говорит, что экрану профиля нужны имя, аватар и 3 последних поста. Если компоненту не нужен email, его не стоит запрашивать. Так вы снижаете лишний трафик и делаете зависимость UI от данных более явной.
Из чего состоит ответ на интервью
Хороший короткий ответ можно построить так:
- Дайте определение: GraphQL это язык запросов и runtime для API.
- Объясните схему: она описывает типы, поля, аргументы и доступные операции.
- Назовите операции:
queryдля чтения,mutationдля изменения,subscriptionдля обновлений. - Добавьте frontend-вывод: можно запрашивать только нужные поля, генерировать типы и аккуратно работать с кэшем.
- Покажите ограничение: производительность, авторизация и ошибки не решаются автоматически.
Пример формулировки:
GraphQL это способ описывать запросы к API через типизированную схему. Клиент сам выбирает поля, которые нужны экрану, а сервер валидирует и исполняет запрос. Для фронтенда это удобно, потому что можно уменьшить лишние данные и получить типы из схемы, но нужно помнить про кэш, частичные ошибки и тяжелые вложенные запросы.
Когда GraphQL действительно полезен
GraphQL особенно хорошо подходит, когда один экран собирает данные из нескольких связанных сущностей. Например, профиль пользователя может показывать данные пользователя, настройки, последние посты, счетчики и права доступа. Вместо нескольких ручных запросов вы описываете одну операцию под экран.
Но это не значит, что GraphQL нужен везде. Если API простой, команда уже хорошо поддерживает REST, а форма данных почти не меняется, переход может добавить больше процессов, чем пользы. На интервью лучше не противопоставлять подходы резко. Сильнее звучит ответ, где вы говорите про критерии выбора.
Как выбрать между GraphQL и более простым API
GraphQL может сократить число ручных запросов и дать удобную форму ответа.REST может быть дешевле и понятнее, особенно если команда уже хорошо его поддерживает.GraphQL-схема и codegen хорошо помогают, если команда следит за совместимостью схемы.Нужны лимиты, батчинг, кэш и договоренности по запросам. Иначе клиент легко создаст дорогой сценарий.Что важно для 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
Называть GraphQL заменой базы данных
GraphQL не хранит данные сам по себе. Он описывает контракт API и исполняет запросы через серверные резолверы, которые уже обращаются к базам, сервисам или другим API. На интервью лучше сказать, что это слой между клиентом и источниками данных.
- 2
Говорить, что GraphQL всегда быстрее REST
Меньший payload не гарантирует быстрый ответ. Глубокий запрос может вызвать много резолверов, N+1 и долгую загрузку экрана. Безопаснее сказать, что GraphQL дает клиенту гибкость, но производительность зависит от схемы, сервера, кэша и контроля сложности.
- 3
Проверять только HTTP-статус
GraphQL-ответ может прийти с
dataиerrorsодновременно. Если UI смотрит только наresponse.ok, он может показать неполные данные как успешный экран. Нужна отдельная обработка сетевых ошибок, ошибок GraphQL и частичных данных. - 4
Запрашивать все поля на всякий случай
Так вы теряете главное преимущество GraphQL и создаете лишнюю нагрузку на сеть и сервер. На фронтенде запрос должен соответствовать данным конкретного экрана. Общие части лучше выносить во фрагменты, но не превращать их в огромный универсальный запрос.
- 5
Забывать про версионирование схемы
В GraphQL часто не заводят версии URL, поэтому совместимость держится на схеме. Удаление или переименование поля может сломать старый клиент. Лучше использовать deprecation, метрики использования полей и проверку запросов в CI.
- 6
Не учитывать гонки запросов в UI
Если пользователь быстро меняет фильтр, вкладку или маршрут, старый GraphQL-ответ может прийти позже нового и перезаписать экран неактуальными данными. Безопаснее отменять запрос, игнорировать ответ с устаревшими variables или использовать возможности клиента для dedupe, abort и корректного refetch-состояния.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание GraphQL, схемы, ошибок и практики frontend-разработки.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое API 😎
API это контракт, по которому одна программа обращается к другой. На странице разбираем, как объяснить API на интервью и какие риски важны для frontend: формат данных, ошибки, безопасность и изменение контракта.
Что делать, если при запросе приходит 500 😎
500 означает внутреннюю ошибку сервера, но фронтенд все равно должен проверить корректность запроса, собрать контекст и показать пользователю безопасное состояние. На странице разбираем, что сказать на интервью и как не ухудшить UX повторными запросами.