SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
Follow us @boldarecom
GraphQL w React
z wykorzystaniem
Apollo
Follow us @boldarecom
Michał Tomsia
Software Developer @Boldare
Follow us @boldarecom
Michał Czmiel
Software Developer @Boldare
Follow us @boldarecom
Agenda
1. Wprowadzenie do GraphQL oraz Apollo
2. Instalacja i konfiguracja Apollo Client
3. Pobieranie danych
4. Krótkie wprowadzenie do Apollo Server
5. Zarządzanie stanem aplikacji
6. Generowanie kodu
7. Problemy oraz inne funkcjonalności
8. Przyszłość Apollo
9. Q & A
Follow us @boldarecom
GraphQL
Język zapytań wykorzystywany do obsługi
API, oferujący elastyczność w kontekście
określania kształtu danych pobieranych
z serwera.
Follow us @boldarecom
GraphQL vs REST
● jeden endpoint
● w zapytaniu określamy dokładnie
strukturę danych, które są nam
potrzebne
● nie ma potrzeby wersjonowania API
● redukcja liczby zapytań do serwera
Query
query launchpadInfo {
launchpads {
id
status
launches(first: 3) {
flight_number
mission_name
}
}
}
Schema
type Query {
launchpads: [Launchpad]
}
type Mutation {
addLaunchpad(input: AddLaunchpadInput!): Launchpad!
updateLaunchpadStatus(status: String): Launchpad!
}
type Subscription {
launchpadAdded: Launchpad!
}
type Launchpad {
id: Int
status: String
launches: [Launch]
}
...
# pozostałe typy danych
# enum, interface, union, scalar
# fragment
# input
Mutation
mutation UpdateLaunchpadStatus {
updateLaunchpadStatus {
id
status
}
}
mutation AddLaunchpad($input:
AddLaunchpadInput!) {
addLaunchpad(input: $input) {
id
status
}
}
Resolver
root - rezultat wywołania funkcji
resolvera dla rodzica
args - argumenty przesłane do pola w
zapytaniu
context - mutowalny obiekt, który jest
przesyłany
do wszystkich resolverów
info - informacje specyficzne dla danego
pole, które są istotne dla zapytania
# domyślne resolvery
Launchpad: {
status: (root, args, context, info) =>
root.status,
}
Follow us @boldarecom
Apollo
● Apollo Client 12.3k ⭐
○ klient
○ oficjalne (React, iOS)
○ nieoficjalne (Vue, Svelte, Angular)
● Apollo Server 8.3k ⭐
○ Node.js GraphQl API
● Apollo Graph Manager
○ usługa chmurowa serwująca API GraphQL
Follow us @boldarecom
Instalacja
● Apollo-boost
○ bazowa, rekomendowana konfiguracja
Apollo client
● @apollo/react-hooks
○ API wykorzystujące React Hooks
● Graphql
○ Obsługa języka GraphQL
Follow us @boldarecom
Konfiguracja
Dla Apollo Boost
● Stworzenie instancji Apollo Client
● Przekazanie stworzonej instancji do
ApolloProvider
Follow us @boldarecom
Apollo links
● Mały zbiór funkcjonalności kontrolujący
przepływ danych
○ link-state-error (customowa obsługa błędów)
○ apollo-link-context (autoryzacja)
○ apollo-link-state (zarządzanie lokalnym
stanem)
useQuery
const res = useQuery(GET_ROCKET, {
variables,
// CZY POMINĄĆ WYWOŁANIE
skip,
// ŹRÓDŁO DANYCH (cache, sieć, …)
fetchPolicy,
// CALLBACKS
onCompleted,
onError,
// POLLING (MS)
pollInterval,
});
const {
data,
loading,
error,
// PONOWNE WYWOŁANIE Z NOWYMI ARG
refetch,
// PAGINACJA
fetchMore,
// POLLING
startPolling,
stopPolling
...rest,
} = useQuery(GET_ROCKETS);
useQuery
Follow us @boldarecom
Cache zapytań
● Automatyczny, znormalizowany cache
● obiekt => obiekt & { id, __typename }
● Zawsze albo nigdy __typename
● Update po mutacji
● dataIdFromObject
○ własne generowanie kluczy cache
Follow us @boldarecom
Apollo Server
● Node.js
● Zgodny ze standardem GraphQL
● Podstawowe komponenty
○ typedefs (jakie dane możemy otrzymać)
○ resolvers (jak otrzymać te dane)
Apollo Server
import { ApolloServer } from “apollo-server”
const server = new ApolloServer({
typeDefs,
resolvers,
playground,
});
server.listen().then(({ url ) => {
console.log(`Server ready at ${url}`);
});
useMutation
const ADD_LAUNCHPAD = gql`
mutation AddLaunchpad($input: AddLaunchpadInput!) {
addLaunchpad(input: $input) {
id
status
}
}
}`;
const [addLaunchpad, response] = useMutation(
ADD_LAUNCHPAD,
{
// CALLBACK NP. DO AKTUALIZACJI CACHE
update,
// OPTYMISTYCZNE UI
optimisticResponse,
// PONOWNE POBRANIE WYBRANYCH ZAPYTAŃ
refetchQueries,
onCompleted,
onError,
}
);
Follow us @boldarecom
Zarządzanie lokalnym
stanem aplikacji
● defaults
● resolvers
● zdefiniowanie mutacji w GraphQL
● zdefiniowanie query w GraphQL
Setup
import { withClientState } from ‘apollo-link-state’
const cache = new InMemoryCache(...)
const stateLink = withClientState({
cache,
resolvers: {
Mutation: {
updateStatus: (parent, args, { cache }) => {
const data = { … };
cache.writeData({ data });
return null;
}
}
}
})
const client = new ApolloClient({
cache,
link: ApolloLink.from([
stateLink,
new HttpLink({
uri: ‘http://backend.example/graphql’
})
])
})
Setup
z Apollo
Boost
import ApolloClient from ‘apollo-boost’
const client = new ApolloClient({
uri: ‘http://backend.example/graphql’,
resolvers: {
Muatation: {
updateStatus: (parent, args, {
cache }) => {
const data = { … };
cache.writeData({ data });
return null;
}
}
}
})
Bezpośredni
zapis do cache
import { ApolloConsumer } from
‘react-apollo’
<ApolloConsumer>
{cache => (
<button
onClick={() => cache.writeData({
data: { isOpen: true },
})}
>
Trigger
</button>
)}
</ApolloConsumer>
Resolver
dla mutacji
resolvers: {
Mutation: {
openDrawer: (parent, args, { cache }) => {
cache.writeData({
data: { isOpen: true },
});
return null;
}
}
}
gql`
mutation {
openDrawer: Boolean! @client
}
`
gql`
query {
isOpen @client
}
`
Follow us @boldarecom
Dobre praktyki
● Zapytania obok ich użycia
● Jeden obiekt argumentów zamiast listy
● Kompilacja zapytań w czasie budowania
○ babel-plugin-graphql-tag
● Nie nadużywaj metaprogramowania
○ Przykład: Generowanie __typename lub
zapytań w runtime
Follow us @boldarecom
Tooling
● Generacja kodu
○ @graphql-codegen
● Edytor
○ Apollo GraphQL (VSC)
● Lintowanie
○ eslint-plugin-graphql
● Debugowanie
○ Apollo Client Developer Tools (Chrome)
Follow us @boldarecom
Graphql Code Gen
● codegen.yaml
● Generowanie typów, skalarów oraz typów
zapytań
● Generowanie hooków do pobierania zasobów
● Możliwość uruchomienia jako prehook lub
podczas CI
Follow us @boldarecom
Apollo Client 3.0
Zmiany w dependencies
● apollo-boost -> @apollo/client
● apollo-link-state -> @apollo/client
● @apollo/react-hooks -> @apollo/client
DEMO
Q & A
@boldarecom

Weitere ähnliche Inhalte

Ähnlich wie GraphQL w React z wykorzystaniem Apollo

AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
Marcin Baran
 

Ähnlich wie GraphQL w React z wykorzystaniem Apollo (20)

Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy SpringXlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)AngularJS szkolenie wewnętrzne (into)
AngularJS szkolenie wewnętrzne (into)
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp Trójmiasto
 
react-pl.pdf
react-pl.pdfreact-pl.pdf
react-pl.pdf
 
Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!Service workers - bądź online, nawet kiedy jesteś offline!
Service workers - bądź online, nawet kiedy jesteś offline!
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
 
AngularJS - podstawy
AngularJS - podstawyAngularJS - podstawy
AngularJS - podstawy
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Środowisko testowe pod REST-a
Środowisko testowe pod REST-aŚrodowisko testowe pod REST-a
Środowisko testowe pod REST-a
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
 
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
xlab #8 - Architektura mikroserwisów na platformie Spring Bootxlab #8 - Architektura mikroserwisów na platformie Spring Boot
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
 
Angular Restmod
Angular RestmodAngular Restmod
Angular Restmod
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z API
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 

Mehr von Boldare

Mehr von Boldare (9)

Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...
 
De–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | BoldareDe–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | Boldare
 
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
 
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #510 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
 
Understanding web sockets from the ground up
Understanding web sockets from the ground upUnderstanding web sockets from the ground up
Understanding web sockets from the ground up
 
Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.
 
The functional reactive nature of Marble.js
The functional reactive nature of Marble.jsThe functional reactive nature of Marble.js
The functional reactive nature of Marble.js
 
Summary of 2018 at boldare
Summary of 2018 at boldareSummary of 2018 at boldare
Summary of 2018 at boldare
 
Why UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software productsWhy UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software products
 

GraphQL w React z wykorzystaniem Apollo

  • 1. Follow us @boldarecom GraphQL w React z wykorzystaniem Apollo
  • 2. Follow us @boldarecom Michał Tomsia Software Developer @Boldare
  • 3. Follow us @boldarecom Michał Czmiel Software Developer @Boldare
  • 4. Follow us @boldarecom Agenda 1. Wprowadzenie do GraphQL oraz Apollo 2. Instalacja i konfiguracja Apollo Client 3. Pobieranie danych 4. Krótkie wprowadzenie do Apollo Server 5. Zarządzanie stanem aplikacji 6. Generowanie kodu 7. Problemy oraz inne funkcjonalności 8. Przyszłość Apollo 9. Q & A
  • 5. Follow us @boldarecom GraphQL Język zapytań wykorzystywany do obsługi API, oferujący elastyczność w kontekście określania kształtu danych pobieranych z serwera.
  • 6. Follow us @boldarecom GraphQL vs REST ● jeden endpoint ● w zapytaniu określamy dokładnie strukturę danych, które są nam potrzebne ● nie ma potrzeby wersjonowania API ● redukcja liczby zapytań do serwera
  • 7. Query query launchpadInfo { launchpads { id status launches(first: 3) { flight_number mission_name } } }
  • 8. Schema type Query { launchpads: [Launchpad] } type Mutation { addLaunchpad(input: AddLaunchpadInput!): Launchpad! updateLaunchpadStatus(status: String): Launchpad! } type Subscription { launchpadAdded: Launchpad! } type Launchpad { id: Int status: String launches: [Launch] } ... # pozostałe typy danych # enum, interface, union, scalar # fragment # input
  • 9. Mutation mutation UpdateLaunchpadStatus { updateLaunchpadStatus { id status } } mutation AddLaunchpad($input: AddLaunchpadInput!) { addLaunchpad(input: $input) { id status } }
  • 10. Resolver root - rezultat wywołania funkcji resolvera dla rodzica args - argumenty przesłane do pola w zapytaniu context - mutowalny obiekt, który jest przesyłany do wszystkich resolverów info - informacje specyficzne dla danego pole, które są istotne dla zapytania # domyślne resolvery Launchpad: { status: (root, args, context, info) => root.status, }
  • 11. Follow us @boldarecom Apollo ● Apollo Client 12.3k ⭐ ○ klient ○ oficjalne (React, iOS) ○ nieoficjalne (Vue, Svelte, Angular) ● Apollo Server 8.3k ⭐ ○ Node.js GraphQl API ● Apollo Graph Manager ○ usługa chmurowa serwująca API GraphQL
  • 12. Follow us @boldarecom Instalacja ● Apollo-boost ○ bazowa, rekomendowana konfiguracja Apollo client ● @apollo/react-hooks ○ API wykorzystujące React Hooks ● Graphql ○ Obsługa języka GraphQL
  • 13. Follow us @boldarecom Konfiguracja Dla Apollo Boost ● Stworzenie instancji Apollo Client ● Przekazanie stworzonej instancji do ApolloProvider
  • 14. Follow us @boldarecom Apollo links ● Mały zbiór funkcjonalności kontrolujący przepływ danych ○ link-state-error (customowa obsługa błędów) ○ apollo-link-context (autoryzacja) ○ apollo-link-state (zarządzanie lokalnym stanem)
  • 15. useQuery const res = useQuery(GET_ROCKET, { variables, // CZY POMINĄĆ WYWOŁANIE skip, // ŹRÓDŁO DANYCH (cache, sieć, …) fetchPolicy, // CALLBACKS onCompleted, onError, // POLLING (MS) pollInterval, });
  • 16. const { data, loading, error, // PONOWNE WYWOŁANIE Z NOWYMI ARG refetch, // PAGINACJA fetchMore, // POLLING startPolling, stopPolling ...rest, } = useQuery(GET_ROCKETS); useQuery
  • 17. Follow us @boldarecom Cache zapytań ● Automatyczny, znormalizowany cache ● obiekt => obiekt & { id, __typename } ● Zawsze albo nigdy __typename ● Update po mutacji ● dataIdFromObject ○ własne generowanie kluczy cache
  • 18. Follow us @boldarecom Apollo Server ● Node.js ● Zgodny ze standardem GraphQL ● Podstawowe komponenty ○ typedefs (jakie dane możemy otrzymać) ○ resolvers (jak otrzymać te dane)
  • 19. Apollo Server import { ApolloServer } from “apollo-server” const server = new ApolloServer({ typeDefs, resolvers, playground, }); server.listen().then(({ url ) => { console.log(`Server ready at ${url}`); });
  • 20. useMutation const ADD_LAUNCHPAD = gql` mutation AddLaunchpad($input: AddLaunchpadInput!) { addLaunchpad(input: $input) { id status } } }`; const [addLaunchpad, response] = useMutation( ADD_LAUNCHPAD, { // CALLBACK NP. DO AKTUALIZACJI CACHE update, // OPTYMISTYCZNE UI optimisticResponse, // PONOWNE POBRANIE WYBRANYCH ZAPYTAŃ refetchQueries, onCompleted, onError, } );
  • 21. Follow us @boldarecom Zarządzanie lokalnym stanem aplikacji ● defaults ● resolvers ● zdefiniowanie mutacji w GraphQL ● zdefiniowanie query w GraphQL
  • 22. Setup import { withClientState } from ‘apollo-link-state’ const cache = new InMemoryCache(...) const stateLink = withClientState({ cache, resolvers: { Mutation: { updateStatus: (parent, args, { cache }) => { const data = { … }; cache.writeData({ data }); return null; } } } }) const client = new ApolloClient({ cache, link: ApolloLink.from([ stateLink, new HttpLink({ uri: ‘http://backend.example/graphql’ }) ]) })
  • 23. Setup z Apollo Boost import ApolloClient from ‘apollo-boost’ const client = new ApolloClient({ uri: ‘http://backend.example/graphql’, resolvers: { Muatation: { updateStatus: (parent, args, { cache }) => { const data = { … }; cache.writeData({ data }); return null; } } } })
  • 24. Bezpośredni zapis do cache import { ApolloConsumer } from ‘react-apollo’ <ApolloConsumer> {cache => ( <button onClick={() => cache.writeData({ data: { isOpen: true }, })} > Trigger </button> )} </ApolloConsumer>
  • 25. Resolver dla mutacji resolvers: { Mutation: { openDrawer: (parent, args, { cache }) => { cache.writeData({ data: { isOpen: true }, }); return null; } } } gql` mutation { openDrawer: Boolean! @client } ` gql` query { isOpen @client } `
  • 26. Follow us @boldarecom Dobre praktyki ● Zapytania obok ich użycia ● Jeden obiekt argumentów zamiast listy ● Kompilacja zapytań w czasie budowania ○ babel-plugin-graphql-tag ● Nie nadużywaj metaprogramowania ○ Przykład: Generowanie __typename lub zapytań w runtime
  • 27. Follow us @boldarecom Tooling ● Generacja kodu ○ @graphql-codegen ● Edytor ○ Apollo GraphQL (VSC) ● Lintowanie ○ eslint-plugin-graphql ● Debugowanie ○ Apollo Client Developer Tools (Chrome)
  • 28. Follow us @boldarecom Graphql Code Gen ● codegen.yaml ● Generowanie typów, skalarów oraz typów zapytań ● Generowanie hooków do pobierania zasobów ● Możliwość uruchomienia jako prehook lub podczas CI
  • 29. Follow us @boldarecom Apollo Client 3.0 Zmiany w dependencies ● apollo-boost -> @apollo/client ● apollo-link-state -> @apollo/client ● @apollo/react-hooks -> @apollo/client
  • 30. DEMO
  • 31. Q & A