はじめに
ここ1,2週間くらいで GraphQL を Rails プロジェクトに導入したので、知見を共有できたらと思い書いていきます。
ハマったことを、解決したことと未だに困っていることに分けて書いていきます。
解決したこと
graphql-ruby の ドキュメントが古く、最新の書き方がわからなかった
graphql-rubyの commit 履歴を見て、ドキュメント、モジュールが古い場合は気をつけて使うようにしましょう。
重要! 5月頃リリースされたv1.8.0から大きく変わり、 class-based API
になりました。
class-based APIの実装はこちらを参照してください。
http://graphql-ruby.org/schema/class_based_api
例えば、 Get Started の中で 以下のように genarate してくださいとありますが、このgenerateor自体が古いのでTOPページの example をコピペしましょう。
古い generator
rails g graphql:object Post title:String rating:Int comments:[Comment]
最新の書き方
class Types::ProfileType < Types::BaseObject
field :id, ID, null: false
field :name, String, null: false
field :avatar, Types::PhotoType, null: true
end
GraphQLの参考になるものが少ない
こちらに public APIの参考URLがまとまっているので、ぜひ試してみてください。
https://github.com/APIs-guru/graphql-apis
ざっくりでいいからコーディング規約ほしい
kibelaの方がコーディング規約を公開しているので、参考にさせていただきました。
https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697
Collection と Array って何が違うの?
以下がわかりやすいです。
コレクション型のフィールドは基本的にconnection型にします
いかなるケースでも要素をすべて取得する フィールドはarray型にします
引用元:https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697#connection-vs-array
困っていること
どこまでwhereできるようにするべきか
GitHubはsearchというfieldを作って汎用的に検索できる形にしています。
この場合柔軟性は高いものの、 query に何を入れるべきかをドキュメントに書く必要があるのが面倒だと感じました。
yelpを見てみると、細かく引数が設定されていて利用イメージは湧きやすいかなと思いました。
ただ、引数が増えすぎると見づらいという問題はあります。
yelpのサンプルクエリはこちら
N+1問題
graphql-batch
検索するとよく出てくる方がこちらです。
これ用にロジックを多く書かないといけないので、記述量が増えてしまうのが懸念点でした。
↑のこの次の goldiloader で解決しきれなかったら導入検討します。
https://github.com/Shopify/graphql-batch
goldiloader
このgemであれば入れるだけで解決できるクエリも結構あるので試している最中です。
https://github.com/salsify/goldiloader
本当にバージョン管理しなくていいのか
facebookのグラフAPIエクスプローラはがっつりバージョン管理していたので悩ましいところです。
(githubも頭にv4がついているのも気になります。)
最後に
GraphQLの導入により、アプリ・フロントとバックエンドとのコミュニケーションコストが下がりそうだと感じています。
本当に小さく始められるので、まず導入してみて合うかどうか見てみるとよさそうです。
いろいろな実装やスキーマ見ながら試行錯誤中ですが、もし知見がある方いらっしゃったらコメントいただけると助かります!
グロービスはエンジニア・デザイナー積極採用中ですので、もし興味ある方は Wantedly 覗いてください!
参考になるリンク
http://graphql-ruby.org/schema/class_based_api
https://www.howtographql.com/
https://qiita.com/vsanna/items/031aa5a17a2f284eb65d
https://bitjourney.kibe.la/shared/entries/1f26acbe-315f-42b8-9ecd-11bcaac5b697
https://www.yelp.com/developers/graphql/guides/intro
https://github.com/APIs-guru/graphql-apis