Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Data-fetching in React applications with Relay ...
Search
Marc-Andre Giroux
August 10, 2016
Programming
710
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Data-fetching in React applications with Relay & GraphQL
Marc-Andre Giroux
August 10, 2016
More Decks by Marc-Andre Giroux
See All by Marc-Andre Giroux
It Depends - Examining GraphQL Myths & Assumptions
xuorig
0
140
So you Want to Distribute your GraphQL Schema?
xuorig
4
880
So you Want to Distribute your GraphQL Schema?
xuorig
0
690
GraphQL Schema Design @ Scale
xuorig
5
2.2k
Continuous Evolution of GraphQL Schemas @ GitHub
xuorig
3
2.2k
GraphQL à Shopify
xuorig
0
290
Exploring GraphQL
xuorig
0
310
GraphQL @ Shopify
xuorig
6
1.8k
GraphQL on Rails
xuorig
2
400
Other Decks in Programming
See All in Programming
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
230
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
160
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
180
Flow は今どうなっているか
mizdra
PRO
0
510
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
120
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
220
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
230
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
360
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
260
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
Marketing to machines
jonoalderson
1
5.7k
Embracing the Ebb and Flow
colly
88
5.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
700
Git: the NoSQL Database
bkeepers
PRO
432
67k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Transcript
Data-fetching in React applications with Relay & GraphQL 1
A beautiful component 2
A beautiful simple component 3
React { <Shop> <Product> <ProductImage> 4
{ Shop component 5
Product component { 6
ProductImage component { 7
What if we needed to add a description? { 8
What kind of data is needed ? Shop Product Image
9
Let’s fetch that using reusable endpoints ? /shop/1 /products/1 /products/2
image/sabc images/def 10
Let’s fetch that using ad-hoc endpoints ? /shop_cart_page /shop_cart_page?include=images /shop_cart_page_with_images?num_images=2
/shop_cart_page_single_prices_and_descriptions_version1.2 /shop_cart_page_with_prices_and_descriptions_but_no_images 11 op_cart_page_with_prices_and_descriptions_and_images_but_only_one_300
12
GraphQL 13
query { myShop { name } } Simple query 14
Response { “myShop” { “name”: “My Kool Shop” } }
15
Query { myShop { name location { city address }
products(orderby: PRICE) { name price } } } 16
Response { “myShop” { “name”: “My Kool Shop”, “location”: {
“city”: “Montreal”, “address”: “5333 Avenue Casgrain”, }, “products”: [{ “name”: “A Chair”, “price”: 10000 }, { “name”: “A Table”, “price”: 20000 }] } } 17
Type System { myShop { name location { city address
} products(orderby: PRICE) { name price } } } type QueryRoot { myShop: Shop } 18
Type System enum ProductOrderEnum { PRICE, POPULARITY, ALPHABETICAL } type
Shop { name: String location: Address products(orderby: OrderEnum): [Product] } { { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 19
Type System type Address { city: String address: String }
{ { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 20
Type System type Product { name: String price: Int }
{ { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 21
Fragments { { myShop { name …locationFragment } } fragment
locationFragment on Shop { location { city address } } 22
Mutations { mutation { createProduct(name: “Kanye West Shoes”) { name
} } 23
How Relay can help { Relay React GraphQL 24
Query colocation { query Fragment Fragment Fragment Fragment 25
Query colocation { Shop Product Product Image 26
Relay Containers / Higher Order Components { Relay.createContainer(ShopComponent, { fragments:
{ … } }); Container Shop 27
Shop Component (Relay) { 28
Shop component (Relay) { 29
Product component (Relay) { 30
ProductImage component (Relay) { 31
How the *&^#@$ does that even work? { 32
Step 1: Making sense out of fragments { fragments: {
image: () => Relay.QL` fragment on Image { url } `, }, 33
Relay.QL (pre-transform) { fragments: { image: () => Relay.QL` fragment
on Image { url } `, }, 34
Relay.QL (transformed) { fragments: { image: function image() { return
function () { return { children: [{ fieldName: 'url', kind: 'Field', metadata: {}, type: 'String' }, { fieldName: 'id', kind: 'Field', metadata: { isGenerated: true, isRequisite: true }, type: 'ID' }], id: _reactRelay2.default.QL.__id(), kind: 'Fragment', metadata: {}, name: 'ProductImage_ImageRelayQL', type: 'Image' }; }(); } 35
Step 2: Query diff ( The Store ) { RelayRecord
Store • Client Side Cache • Normalized / Flattened Store 36
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { name image { url } } `, }, 37
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { name description image { url } } `, }, 38
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { description } `, }, 39
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { description } `, }, 40
Step 3: Split Deferred queries { fragments: { product: ()
=> Relay.QL` fragment on Product { name description ${Images.getFragment('product').defer()}} } `, }, 41
Step 3: Split Deferred queries { 42
Step 3: Split Deferred queries { 43
Step 4: Subtract in-flight queries { 44
Step 4: Subtract in-flight queries { 45
{ myShop { name location { city address } products(orderby:
PRICE) { name price } } } Final step: Printing { 46
Back to the Store { 47 Relay Record Store Cached
Records Queued Records
Mutations { class AddProductMutation extends Relay.Mutation { getMutation() { return
Relay.QL`mutation { addProduct }`; } getVariables() { return { productName: this.props.product.name }; } getFatQuery() { … } getConfigs() { … } getOptimisticResponse() { … } } 48
And so much more { 49 Subscriptions @stream Garbage collection
Server side rendering Connections
For more info: { 50 https://facebook.github.io/relay https://github.com/facebook/graphql
Thank you! Try it out yourself :) @__xuorig__ http://mgiroux.me xuorig
51