Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage...
Search
komaki
July 04, 2019
Programming
6.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage example of GraphQL (Mutation) in frontend
komaki
July 04, 2019
Transcript
50 slides
フロントエンドでのGraphQL(Mutation)の利用例と今後について SPACEMARKET Tech Meetup #2 2019/7/4 Shunsuke Komaki
2 自己紹介 • Shunsuke Komaki(@shun_komaki) • フロントエンドエンジニア • 開発、パフォーマンス改善してます
3 話すこと
4 話すこと • これまでの SPACEMARKET での GraphQL • フロントエンドでの GraphQL
実装 ◦ Apollo Client を使った Mutation 実装の話です • 今後やっていきたいこと • まとめ
5 これまでの SPACEMARKET での GraphQL
6 これまでの SPACEMARKET での GraphQL • React • Redux /
redux-saga • Apollo Client • Flow(徐々に TypeScript 移行中) 開発環境
7 これまでの SPACEMARKET での GraphQL • 参照は GraphQL • 更新は
REST API • 4月にリニューアルした SPACEMARKET EVENT で 更新も GraphQL に!! GraphQL
8 これまでの SPACEMARKET での GraphQL 今日は Mutation をメインに話をすすめていきます❗
9 これまでの SPACEMARKET での GraphQL 開発については前回のミートアップ記事でも紹介しています。 https://blog.spacemarket.com/news/first-tech-meetup/
10 クライアントでの GraphQL 実装
11 ライブラリ
12 ライブラリ GraphQL のバックエンドとフロントエンドのライブラリです。 フロントエンドでは Apollo Client を使いました。 Apollo のパッケージには開発に役立つ、様々な便利なものがあります。
Apollo
13 Apollo Apollo Client 2.0 以降で推奨のキャッシュ実装です。 Redux の Store のようなイメージで扱うことができます。
一度取得したデータを参照したいときは、ネットワーク通信せずにキャッシュを 参照することができます。(Direct Cache Access) apollo-cache-inmemory
14 イメージ server サーバーにリクエスト cache 取得済みのデータは ネットワーク通信なしで キャッシュから読み込 みできる Apollo
Client レスポンスはキャッシュに保存する
15 Error GraphQL エラーやネットワークエラーが発生したときにカスタムロジックを実 装することができます。 エラーログを処理したり、再リクエストしたり。 apollo-link-error
16 Error
17 • レスポンスフィールドに独自定義型である UserError 型を定義 • クライアントはクエリ内にエラーのフィールドに明示的に UserError を書く •
レスポンスに UserError があるときは UI に反映 参考:https://blog.spacemarket.com/code/graphql-ruby-concerns/ バリデーションエラー Error
18 エラーのフィールドを書く Error
19 Mutation
20 Mutation Component
21 Mutation Component react-apollo の Mutation Component <Mutation> コンポーネントの render
props で mutation の実行可能な関数を受 け取ることができます。
22 Mutation Component • UI コンポーネントは Atomic Design 準拠で別リポジトリで管理 •
Container からは Pages か Organisms で UI コンポーネントを呼ぶだけ • Molecules や Atoms は呼ばない • Organisms 以下で複数の Mutation を行いたいイベントハンドラがあるとネス トが深くなりコードが見にくい 課題
23 イメージ
24 イメージ Container では複数の mutation 関数だけを受け取るようにしたい
25 graphql 関数を使う
26 graphql 関数を使う react-apollo の graphql
27 react-apollo の graphql で関数を渡す • Component に mutate という関数を渡す
• mutate を実行すると graphql のパラメータに渡した mutation がリクエストさ れる
28 react-apollo の graphql で関数を渡す graphql の第二引数の config オブジェクトで名前の変更も可能 参考:https://www.apollographql.com/docs/react/api/react-apollo/#graphqlquery-configcomponent
29 複数の関数を扱いたい • react-apollo の compose で複数の graphql 関数をまとめることができる •
単体で使うときと同じように props として渡せる compose を使う
30 イメージ
31 Mutation のレスポンスでキャッシュを更新する
32 Direct Cache Access
33 更新後のデータを反映する • readQuery ◦ キャッシュからデータを取得する ◦ サーバーに通信しない • wirteQuery
◦ キャッシュにデータを書き込む
34 イメージ server リクエスト Apollo Client mutation に書いたフィールドを返す 今回なら id
と name をもつ addUser mutation addUser { addUser { id name } }
35 イメージ キャッシュからデータを取得(readQuery) cache Apollo Client id や name をマージしたオブジェクトをキャッ
シュに書き込み(writeQuery)
36 イメージ
37 課題
38 課題 • 状態管理は Redux まとめて行っていた • Apollo 導入によりサーバーから取得するデータを Apollo
のキャッシュで管理 するので Redux が不要になってきた(と思った) • React の local state に移していくが Redux のほうが扱いやすい部分もあり Redux も残した • 結果的に状態管理が散らばり扱いにくくなった
39 イメージ Redux Apollo 導入前 データストア Apollo Redux React Apollo
導入後 データストア
40 イメージ Redux Apollo 導入前 データストア Apollo Redux React Apollo
導入後 データストア 状態管理が複雑になった!
41 課題 • Redux で管理していた状態を Local State に移していってる • サーバーから取得したデータは
Apollo キャッシュ • 完全には Redux はなくなっていないが、今のところはこの構成に近づいてき ている Apollo + Local State
42 イメージ Apollo Redux React Apollo 導入後 データストア Apollo React
43 状態管理の解決案① • 状態が散らばるのはうれしくない • Apollo で local state の管理も行うこともありかもしれない
• クエリに @client を追加してローカルに向けることも可能 • クライアントで resolver を書くことになる 参考:https://www.apollographql.com/docs/react/essentials/local-state Local State も Apollo で
44 状態管理の解決案② • apollo-link-http を使ってデータの取得は GraphQL • 取得したデータはこれまでどおり Redux 管理
react-apollo を使わずにデータ取得だけを行う?
45 今後やっていきたいこと
46 今後やっていきたいこと① • query と mutation のフィールドが完全一致のときにキャッシュが自動で更新 される • readQuery,
writeQuery が必要ない • 全てのフィールドが一致している必要があるのでフラグメント推奨 参考 : https://www.apollographql.com/docs/react/advanced/caching/#automatic-cache-updates Automatic cache updates
47 今後やっていきたいこと② GraphQL に限った話ではないが、スキーマ定義が必要な GraphQLなら スキーマ定義後にフロントとサーバーが同時進行できて開発効率がよくなりそう。 こちらも詳しくは弊社のブログでも触れているのでよかったら見てください。 スキーマ駆動についてのブログ : https://blog.spacemarket.com/code/schema-driven/
スキーマ駆動開発していきたい
48 まとめ
49 まとめ • 学習コストは高くなかった ◦ ドキュメントが充実している ◦ 標準的な機能のみの使用 • 紹介した機能だけで十分に実装できた
• 参照と更新のどちらも GraphQL ならメリットは大きい • 開発の進め方などはまだまだ改善できる
None
Other Decks in Programming
See All in Programming
Railsバージョンを4倍にした話
optim
0
1k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
SODA - FACT BOOK(EN)
sodainc
1
240
ビジネスロジックを堅牢に~Scala 3のドメインプリミティブ~
j5ik2o
0
160
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
320
小さなアプリを作って公開するまで
onozaty
0
170
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
370
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.3k
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.9k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.2k
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
260
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
340
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
4k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Un-Boring Meetings
codingconduct
0
500
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
KATA
mclloyd
PRO
35
16k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
480
How to build a perfect <img>
jonoalderson
1
6.2k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
520
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Skip the Path - Find Your Career Trail
mkilby
1
290
Evolving SEO for Evolving Search Engines
ryanjones
0
360