GraphQL — это стандарт декларирования структуры данных и способов получения данных, предложенный и реализованный Facebook.
Существует несколько реализаций GraphQL:
- От Facebook — http://graphql.org/code/ Тут, правда, странность в том, что базовую технологию https://github.com/graphql/graphql-js не рекомендуют к production. Там же в наборе есть Relay — в чём-то аналог Redux, заточенный на выемку данных с помощью GraphQL-запросов.
- От Apollo — http://www.apollostack.com/ Тут ребята постарались сделать full-stack: и сервер, который по сути представляет собой middleware для express.js, и клиент с хорошей интеграцией с React.
Там же можно найти библиотеки, реализующие GraphQL, на практически всех современных языках программирования, кучу различных примеров реализаций, способов визуализации запросов и пр. и пр.
Что мне понравилось в этой технологии:
1. Декларативное описание структур данных, которые можно запросить с сервера. Только посмотрите на эту красоту:
Так мы описали, например, что с сервера можно запросить Entity с полями _id, title, category типа EntityCategory. В apollo-stack эта строка будет автоматически преобразована в стандартный объект GraphQLSchema.
2. Удобное написание функций, получающих данные (resolvers):
3. Язык запроса данных и Web UI GraphiQL (супер легко подключается к express) с очень крутой валидацией запросов и auto-complete, который учитывает текущую схему. Например, запросим только поле title у Entity по id
4. Конечно же, есть удобные библиотеки для интеграции с react. Мне понравилась react-apollo, но не так давно Facebook обновила клиент relay, и он тоже выглядит неплохо. С помощью такой бибилитеки можно прямо в компоненте описать, какие данные ему нужны. При этом, если сразу рендерится несколько компонентов, которым нужны разные и\или схожие данные, то запрос за данными объединится в один (batch) и после ответа, если компонентам нужны одни и те же данные, то не будет никакого дублирования. Например, так может выглядеть запрос за пользователем. Данные про него загрузятся в props.data компонента Profile:
Итого
Я вижу GraphQL как весьма удобную альтернативу классическому REST API:
- гораздо удобнее иметь одну «ручку», в которую можно слать разнообразные запросы на получение или изменение данных (тут они называются мутациями (mutation);
- удобнее иметь декларативное описание структуры данных, чем портянку из обработчиков путей типа req.get(‘/entities’), req.post(‘/entitites’), req.put(‘/entities/:entityId’) и т.д.
- Также такой подход облегчает формирование единого state для react-приложений, где компоненты сами указывают, какие им нужны данные для работы.