Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage...

komaki
July 04, 2019

フロントエンドでの GraphQL(Mutation) の利用例と今後について / Usage example of GraphQL (Mutation) in frontend

komaki

July 04, 2019
Tweet

Other Decks in Programming

Transcript

  1. 4 話すこと • これまでの SPACEMARKET での GraphQL • フロントエンドでの GraphQL

    実装 ◦ Apollo Client を使った Mutation 実装の話です • 今後やっていきたいこと • まとめ
  2. 6 これまでの SPACEMARKET での GraphQL • React • Redux /

    redux-saga • Apollo Client • Flow(徐々に TypeScript 移行中) 開発環境
  3. 7 これまでの SPACEMARKET での GraphQL • 参照は GraphQL • 更新は

    REST API • 4月にリニューアルした SPACEMARKET EVENT で 更新も GraphQL に!! GraphQL
  4. 13 Apollo Apollo Client 2.0 以降で推奨のキャッシュ実装です。 Redux の Store のようなイメージで扱うことができます。

    一度取得したデータを参照したいときは、ネットワーク通信せずにキャッシュを 参照することができます。(Direct Cache Access) apollo-cache-inmemory
  5. 17 • レスポンスフィールドに独自定義型である UserError 型を定義 • クライアントはクエリ内にエラーのフィールドに明示的に UserError を書く •

    レスポンスに UserError があるときは UI に反映 参考:https://blog.spacemarket.com/code/graphql-ruby-concerns/ バリデーションエラー Error
  6. 21 Mutation Component react-apollo の Mutation Component <Mutation> コンポーネントの render

    props で mutation の実行可能な関数を受 け取ることができます。
  7. 22 Mutation Component • UI コンポーネントは Atomic Design 準拠で別リポジトリで管理 •

    Container からは Pages か Organisms で UI コンポーネントを呼ぶだけ • Molecules や Atoms は呼ばない • Organisms 以下で複数の Mutation を行いたいイベントハンドラがあるとネス トが深くなりコードが見にくい 課題
  8. 27 react-apollo の graphql で関数を渡す • Component に mutate という関数を渡す

    • mutate を実行すると graphql のパラメータに渡した mutation がリクエストさ れる
  9. 29 複数の関数を扱いたい • react-apollo の compose で複数の graphql 関数をまとめることができる •

    単体で使うときと同じように props として渡せる compose を使う
  10. 38 課題 • 状態管理は Redux まとめて行っていた • Apollo 導入によりサーバーから取得するデータを Apollo

    のキャッシュで管理 するので Redux が不要になってきた(と思った) • React の local state に移していくが Redux のほうが扱いやすい部分もあり Redux も残した • 結果的に状態管理が散らばり扱いにくくなった
  11. 40 イメージ Redux Apollo 導入前 データストア Apollo Redux React Apollo

    導入後 データストア 状態管理が複雑になった!
  12. 41 課題 • Redux で管理していた状態を Local State に移していってる • サーバーから取得したデータは

    Apollo キャッシュ • 完全には Redux はなくなっていないが、今のところはこの構成に近づいてき ている Apollo + Local State
  13. 43 状態管理の解決案① • 状態が散らばるのはうれしくない • Apollo で local state の管理も行うこともありかもしれない

    • クエリに @client を追加してローカルに向けることも可能 • クライアントで resolver を書くことになる 参考:https://www.apollographql.com/docs/react/essentials/local-state Local State も Apollo で
  14. 46 今後やっていきたいこと① • query と mutation のフィールドが完全一致のときにキャッシュが自動で更新 される • readQuery,

    writeQuery が必要ない • 全てのフィールドが一致している必要があるのでフラグメント推奨 参考 : https://www.apollographql.com/docs/react/advanced/caching/#automatic-cache-updates Automatic cache updates
  15. 49 まとめ • 学習コストは高くなかった ◦ ドキュメントが充実している ◦ 標準的な機能のみの使用 • 紹介した機能だけで十分に実装できた

    • 参照と更新のどちらも GraphQL ならメリットは大きい • 開発の進め方などはまだまだ改善できる