Evolve your development workflow

We need better tools to build great apps

Why?

Mobile World

Latency

Bandwidth

Processing power

Realtime data

Today's apps are complex

MongoDB

MySQL

Oracle

ERP

CRM

Vue

Angular

React

Micro-services

Redis

Android

iOS

Legacy custom apps

AWS

JavaScript

Java

C#

Team Communication needs

Frontend Team

Backend Team

DataBase Team

Other Service Team

Mobile World

Today's apps are complex

Team Communication needs

Why?

GraphQL solves problems
Apollo adds value
Vue makes it approachable

1
2
3

GraphQL solves problems

1

What is GraphQL?

Schema definition language

Query language

Community of tools

Strong typing

type Message {
  id: ID!
  content: String
  user: User
  date: Int
}

type User {
  id: ID!
  name: String
  email: String
  avatarUrl: String
}

type Query {
  messages: [Message]
}

Strong typing

Help prevent errors

Improve the debugging experience

More explicit API (auto Docs)

Query only the data you need

{
  messages {
    id
    content
    user {
      id
      name
    }
  }
}
{
  "data": {
    "messages": [
      {
        "id": "0",
        "content": "Are you enjoying the conference?",
        "user": {
          "id": "0",
          "name": "Anne"
        }
      },
      {
        "id": "1",
        "content": "Absolutely!",
        "user": {
          "id": "1",
          "name": "Yoan"
        }
      }
    ]
  }
}

Query only the data you need

Reduce transfer size

No waterfall requests

Get predictable data shape

Clear and simple structure

Version-less

Add new fields

Deprecate old ones

Strong typing

Query language

Simpler architecture

Version-less

GraphQL

Apollo adds value

2

What is Apollo?

Server tools

Feature-rich client

Strong community

Principles

By the community, for the community

Simplicity

Performance

Apollo Client

Query

Mutation

Subscription (Web socket)

.gql

Observable

query

Normalized Cache

Apollo Devtools

Apollo Server

Apollo Server 2.0

Automatic Persisted Queries

File uploads

Data Source: REST

CDN integration

Schema Stitching

Apollo Launchpad

Like JSFiddle but for a GraphQL API

Prototype a GraphQL schema in minutes

Apollo CLI

Schema and queries utils

Generate static types

More in the future?

Apollo Engine

Full-response caching

Monitoring with history

Performance tracing

Errors tracking

GitHub integrations

Slack alerts

1M requests per month free

Apollo Server

Apollo Client

Even more tools

Apollo

Vue makes it approachable

3

vue-apollo

Quick onboarding

import Vue from 'vue'
import VueApollo from 'vue-apollo'

Vue.use(VueApollo)

const provider = new VueApollo({
  defaultClient: apolloClient
})

new Vue({
  provide: provider.provide(),
  // ...
})

Developer Experience

Automatic creation & teardown

Reactive parameters & Automatic updates

SSR-ready

Simpler code

Colocate Data & Components

query {
  user (id: $id) {
    id
    name
    email
    avatar
  }
}
query {
  user (id: $id) {
    id
    name
    email
    avatar
  }
}

Automatic sync

Colocate Data & Components

query {
  user (id: $id) {
    id
    name
    email
    avatar
  }
}
mutate ($input: EditUserInput) {
  editUser (input: $input) {
    id
    name
    email
    avatar
  }
}

Automatic updates

Colocate Data & Components

query {
  user (id: $id) {
    ...user
  }
}
mutate ($input: EditUserInput) {
  editUser (input: $input) {
    ...user
  }
}

Fragments

query {
  user (id: $id) {
    id
    name
    email
    avatar
  }
}
mutate ($input: EditUserInput) {
  editUser (input: $input) {
    id
    name
    email
    avatar
  }
}

Apollo Components

<ApolloQuery
  :query="require('../graphql/HelloWorld.gql')"
  :variables="{ name }"
>
  <template slot-scope="{ result: { loading, error, data } }">
    <!-- Loading -->
    <div v-if="loading" class="loading apollo">Loading...</div>

    <!-- Error -->
    <div v-else-if="error" class="error apollo">An error occured</div>

    <!-- Result -->
    <div v-else-if="data" class="result apollo">{{ data.hello }}</div>

    <!-- No result -->
    <div v-else class="no-result apollo">No result :(</div>
  </template>
</ApolloQuery>

Apollo Components

<ApolloMutation
  :mutation="require('@/graphql/userLogin.gql')"
  :variables="{
    email,
    password,
  }"
  @done="onDone"
>
  <template slot-scope="{ mutate, loading, error }">
    <!-- Form -->
    <input v-model="email" type="email">
    <input v-model="password" type="password">
    <button :disabled="loading" @click="mutate()">Click me</button>

    <!-- Error -->
    <p v-if="error">An error occured: {{ error }}</p>
  </template>
</ApolloMutation>

vue-cli-plugin-apollo

Quicker onboarding

$ vue add apollo
import Vue from 'vue'
import VueApollo from 'vue-apollo'

Vue.use(VueApollo)

const provider = new VueApollo({
  defaultClient: apolloClient
})

new Vue({
  provide: provider.provide(),
  // ...
})

Developer Experience

Included GraphQL Server

Automatic integration

Examples

Upgradable

Quick onboarding

Developer Experience

Colocate Data & Components

Apollo Components

Vue-Apollo

Epilogue

Who is using GraphQL?

You?

Case studies

Your logo here

Guillaume Chau

@Akryum

github.com/Akryum

Thank you!

How Vue and GraphQL can evolve your development workflow

By Guillaume Chau

How Vue and GraphQL can evolve your development workflow

Vue + Apollo + GraphQL: why it's the Ultimate Stack to build great apps

  • 134,236