Что такое GraphQL
Что проверяют
Понимаете ли вы, какую проблему решает GraphQL и сколько это стоит, а не повторяете слоган «запрашивайте только нужное». Следом спрашивают про кэш в Apollo Client и чем GraphQL хуже REST.
Как отвечать
GraphQL это язык запросов и спецификация API: сервер публикует строго типизированную схему (SDL), а клиент в одном запросе описывает форму нужного ответа. Обычно всё ходит на один эндпоинт /graphql.
Ключевые понятия:
- схема и типы:
type,input,enum,interface,union, ненулевые поля с!. Схема это и документация, и контракт; - операции:
queryдля чтения,mutationдля изменения,subscriptionдля потока событий, обычно поверх WebSocket (протоколgraphql-ws) или SSE; - резолверы: на сервере у каждого поля своя функция, которая достаёт данные. Отсюда гибкость и отсюда же проблема N+1, которую решают батчингом через DataLoader;
- фрагменты и переменные: фрагмент описывает данные конкретного компонента, а переменные (
$id: ID!) передаются отдельно от текста запроса.
Главный выигрыш для фронтенда это отсутствие overfetching и underfetching: экран получает ровно свои поля одним запросом вместо трёх REST-вызовов. Клиенты: Apollo Client с нормализованным кэшем по __typename и id, Relay с фрагментами рядом с компонентами, urql. Типы генерируют из схемы через GraphQL Code Generator, и опечатка в имени поля становится ошибкой сборки.
Честно назовите цену. HTTP-кэш и CDN плохо работают с POST-запросами, выручают persisted queries через GET. Ошибки выполнения полей часто приходят со статусом 200 в массиве errors. Произвольно вложенные запросы требуют на сервере лимитов глубины и сложности.
Где спотыкаются
Называют GraphQL базой данных или заменой SQL. Это слой API, за резолверами может стоять что угодно: REST-сервисы, база, кэш.
Проверяют успех только по статусу ответа. Запрос может вернуть 200, частичные данные и errors одновременно, и интерфейс обязан это обработать.
Утверждают, что GraphQL всегда быстрее REST. Один глубоко вложенный запрос легко порождает десятки обращений к базе.