GraphQL:
Евгений Шкодин
Фронтенд-разработчик @ Злые Марсиане
основы и
эмоции
Frontend
GraphQL:
101 & 💜
Frontend
Евгений Шкодин
Фронтенд-разработчик @ Злые Марсиане
Open Source
Фронтенд
Open Source
Бэкенд
Facebook мобильные платформы, 2011
История
Facebook нативные приложения, 2012
RESTful API
FQL
GraphQL для внутреннего пользования, 2012
Публичный релиз спецификации GraphQL,
Июль 2015
Наши дни
RESTful API
GET /photos?top=3
{
description
src
img_src
comments
likes
}
GET /friends?top=3
{
name
url
avatar_url
city
job_title
job_company
}
AdHoc запросы
GET /user/:id/main_view
{
name
avatar_url
bio
photos(3) {
src
}
friends(3) {
name
avatar_url
}
}
Over-fetching
RESTful API и AdHoc запросы
Under-fetching
RESTful API и AdHoc запросы
Преобразование данных
RESTful API и AdHoc запросы
Непредсказуемость
RESTful API и AdHoc запросы
Сложность поддержки кроссплатформенности
RESTful API и AdHoc запросы
Как мы мыслим?
Объекты
Свойства
Взаимоотношения
(о данных)
Что такое GraphQL?
Язык запросов
Что такое GraphQL?
Движок обработки запросов
Что такое GraphQL?
Основные понятия
{
me {
name
}
}
{
"me": {
"name": "Evgenii Shkodin"
}
}
Hello, world!
Основные понятия
Query
Mutation
Subscription
Точки входа
Основные понятия
query GET_MAIN_DATA {
me {
}
}
name
bio
avatarLg: avatar_url(size: 168)
avatarSm: avatar_url(size: 40)
socials {
url
}
photos(limit: 3) {
src
}
friends(limit: 3) {
name
avatar_url(size: 100)
}
Query
Mutation
Subscription
Точки входа
Основные понятия
mutation CREATE_POST($value: String!) {
createPost(value: $value) {
}
}
author {
name
avatar_url(size: 40)
}
body
id
date
...
Точки входа
Основные понятия
Query
Mutation
Subscription
subscription FEED_UPDATES {
postAdded {
}
}
author {
name
avatar_url(size: 40)
}
body
id
date
...
Директива
Основные понятия
query getUser($withFriends: Boolean) {
me {
name
friends @include(if: $withFriends) {
name
}
}
}
schema: {
query: Query
mutation: Mutation
subscription: Subscription
}
Query
Mutation
Subscription
Схема
Основные понятия
GraphQL SDL —
язык описания схемы
Основные понятия
Строгая типизация
Корневые типы
Типизация
type Query {
}
me: User
user(id: ID!): User
type Mutation {
}
type Subscription {
}
createPost(input: PostInput!): Post!
editPost(id: ID!, input: PostInput!): Post!
deletePost(id: ID!): ID!
postAdded: Post!
Скалярные типы+
Типизация
type User {
id: ID!
name String
balance: Float!
friends(limit: Int! = 10): [User!]
friends_count: Int
bio: String
isPremium: Boolean!
}
Резольверы
Query: {
user(obj, args, context, info) {
return context.db.loadUserByID(args.id)
}
}
User: {
name(obj, args, context, info) {
return obj.name
}
}
/* Перерыв */
/* Перерыв */
✨ Интроспекция ✨
запросить у GraphQL схемы всю информацию о мутациях и запросах, которые она поддерживает
🔮 GraphiQL 🔮
Внутребраузерное IDE для исследования GraphQL API
(демо)
⚙️ GraphQL CLI ⚙️
Инструмент командной строки для разработки с GraphQL
(демо)
Command | Description |
---|---|
graphql create [directory] | Cоздать по шаблону новый GraphQL проект |
graphql get-schema | Скачать схему |
graphql schema-status | Показать источник и временную отметку схемы |
graphql query <file> | Выполнить запрос/мутацию |
graphql diff | Показать различие между двумя схемами |
⚙️ GraphQL CLI ⚙️
💡GraphQL расширение💡 для VSСode
Интроспекция 💜 IDE
(демо)
Автодополнение
GraphQL расширение для VSCode
Линтинг и валидация
GraphQL расширение для VSCode
Сниппеты
GraphQL расширение для VSCode
Подсветка синтаксиса
GraphQL расширение для VSCode
🧠 GraphQL Faker 🧠
Расширь GraphQL API fake-данными без единой строчки кода
(demo)
https://github.com/APIs-guru/graphql-faker
🧠 GraphQL Faker 🧠
POLLO
Client
Server
Engine
🚀 Apollo Boost 🚀
Apollo Boost — самый простой, zero-config, способ начать использовать Apollo Client
https://github.com/apollographql/apollo-client/tree/master/packages/apollo-boost
npm install apollo-boost graphql graphql-tag
import ApolloClient from "apollo-boost";
import gql from "graphql-tag";
const client = new ApolloClient({
uri: "/graphql"
});
client
.query({
query: gql`
{
character(id: "1") {
name
}
}
`
})
.then(result => console.log(result));
🚀 Apollo Boost 🚀
⚖️ gql2ts ⚖️
Конвертация GraphQL типов в TypeScript интерфейсы (и Flow-аннотации)
(demo)
https://github.com/avantcredit/gql2ts
⏱Директива defer⏱
Загрузка важных данных в первую очередь
(demo)
https://github.com/avantcredit/gql2ts
⏱Директива defer⏱
query GET_FEED($page: Int!) {
me {
feed(page: $page) {
}
}
}
author {
name
avatar_url(size: 40)
}
body
...
date
id
comments @defer {
author {
name
avatarUrl(size: 40)
}
text
likes
}
- Lee Byron — Exploring GraphQL at react-europe 2015
- Laney Kuenzel & Lee Byron — GraphQL Future at react-europe 2016
- Dan Schafer — GraphQL at Facebook at react-europe 2016
- Lee Byron — Lessons from 4 years of gql
- Павел Черторогов — GraphQL — заключаем выгодный контракт между сервером и клиентом
- Владимир Цукур — GraphQL — API по-новому
Доклады и статьи
Доклады
Статьи
Полезные ссылки
Вопросы?
graphql-basics-and-emotions-ru
By iffjey
graphql-basics-and-emotions-ru
- 541