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
フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage...
Search
komaki
July 04, 2019
Programming
6.2k
2
Share
フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage example of GraphQL (Mutation) in frontend
komaki
July 04, 2019
Other Decks in Programming
See All in Programming
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
0
140
PHPでバイナリをパースして理解するASN.1
muno92
PRO
0
460
(Re)make Regexp in Ruby: Democratizing internals for the JIT
makenowjust
3
1.1k
Agentic AI & UI: Arcitecture, HITL, Emerging Standards
manfredsteyer
PRO
0
110
Agent Skills を社内で育てる仕組み作り
jackchuka
1
2k
KMP × Kotlin 2.3 - How Android Got Slower While iOS Builds Improved by 47%
rio432
0
200
GoogleCloudとterraform完全に理解した
terisuke
1
200
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
3.1k
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
200
Firefoxにコントリビューションして得られた学び
ken7253
2
160
SREに優しいTerraform構成 modulesとstateの組み方
hiyanger
2
180
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
120
Featured
See All Featured
Making Projects Easy
brettharned
120
6.6k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
310
The Cult of Friendly URLs
andyhume
79
6.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.6k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
180
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
320
The Mindset for Success: Future Career Progression
greggifford
PRO
0
330
KATA
mclloyd
PRO
35
15k
For a Future-Friendly Web
brad_frost
183
10k
ラッコキーワード サービス紹介資料
rakko
1
3.3M
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
120
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.4k
Transcript
フロントエンドでの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