graphql-ruby 的主题
今天要讲的事情 de shì
几乎所有的信息都在 http://graphql-ruby.org/ 上写明了。
议程
-
- 自己紹介
-
- graphQL is 何?
-
- graphql-rubyの実装
-
- graphql-rubyのテスト
- graphql-rubyのn+1
我是自己。
我自己是_____ (wǒ shì _____)
-
- 名前:やまたつ
-
- 会社:giftee
- 仕事:rails書いたりfront書いたり
GraphQL 是什么?
请问什么是GraphQL?
-
- RESTfulの代替
-
- facebook発
-
- url
http://graphql.org/
graphql-ruby
http://graphql-ruby.org/
RFC
草案提出中
QLはquery languageのこと
SQLみたいな気分でapiを呼び出す
什么是 GraphQL?
查询
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}
GraphQL 是什么?
变异
mutation {
addHuman(
name: "ほげほげ"
height: 1.8
) {
human {
name
height
}
}
}
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}
GraphQL 是什么?
GraphQL-Ruby的实现
graphql-ruby的实现
开始方法
gem 'graphql'
$ bundle
$ rails g graphql:install
$ bundle
当运行rails g graphql:install命令时,会自动将gem graphiql-rails添加到Gemfile中,因此需要再次运行bundle命令。
GraphQL-Ruby的实现
路径发生变化。
Rails.application.routes.draw do
if Rails.env.development?
mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
end
post "/graphql", to: "graphql#execute"
end
-
- エンドポイントひとつ
- graphiQLは後述
GraphQL-Ruby的实现方法
控制器加入
class GraphqlController < ApplicationController
def execute
variables = ensure_hash(params[:variables])
query = params[:query]
context = {
# Query context goes here, for example:
# current_user: current_user,
}
result = MyappSchema.execute(query, variables: variables, context: context)
render json: result
end
private
...
end
graphql-ruby的实现
在app/graphql目录下添加了schema定义
MyappSchema = GraphQL::Schema.define do
query(Types::QueryType)
end
Types::QueryType = GraphQL::ObjectType.define do
name "Query"
# Add root-level fields here.
# They will be entry points for queries on your schema.
# TODO: remove me
field :testField, types.String do
description "An example field added by the generator"
resolve ->(obj, args, ctx) {
"Hello World!"
}
end
end
- これを書いていきます
schema定义是什么?
schema定義是什麼?
-
- SQLではschema(テーブル定義とか)を決めると使えるクエリがきまる
- それと同じ
什么是schema定义?
展示源代码
https://github.com/yamatatsu/graphql-ruby-playground/
如果不读schema的定义,就不知道如何调用,这太痛苦了。
在那里,使用GraphiQL
何是GraphiQL?
-
- 読み方
ɡrafək(ə)l
たぶん [グラフィクル] でいいと思う(発音記号読めない)
スキーマ定義をもとに実装者向けのクエリの実行環境とDocとをいい感じに出してくれる
展示GraphiQL
http://localhost:3000/graphiql
GraphiQL非常方便。
graphQL(graphql-ruby) 带来的优点
-
- フロントからのapi呼び出しが減る
api呼び出し周りのフロントのコードが減る
mutationの表現力
命名の自由度が高い
引数もschemaで定義できる
引数もGraphiQLでドキュメント化される
apiのurlなんだっけ? がなくなる
GraphiQLで呼び出し方見る
応答のjsonの形なんだっけ? がなくなる
GraphiQLでjsonの形を確認する
在GraphQL (graphql-ruby)中不愉快的事
-
- GraphiQLがmountで動いてる
再起動しないと読み込まれない(調査中)
実装時はGraphiQLではなくテストに頼ろう
”だと構文エラー
“”で動く。わすれがち。
クライアント側のライブラリが分厚い(のが多い)
RESTの代替として小さく始めたい
Relay, ApolloはReact世界への侵食が必要(apolloは違うかも?)
Lokkaを使ってる
schemaの書き方がキモい。めんどい
めちゃめちゃ記述量が減るissues, PRが出てる
すぐにn+1する
後述
用中文原生方式重新解释下面的内容:
GraphQL-Ruby的测试
使用graphql-ruby进行测试。
将本网站转移并使用
-
- Don’t test the schema, test other objects instead
-
- Test schema elements (types, fields) in isolation
- Execute GraphQL queries and test the result
放手
以下是对graphql-ruby的n+1问题的原生中文释义:
graphql-ruby中的n+1问题
以下是graphql-ruby的n+1问题。
什么是graphql-batch?
graphql-batch 是什么?
-
- https://github.com/Shopify/graphql-batch
-
- gemです
graphql-ruby用のgem
sql呼び出しを遅延評価するためのgem
公式サイトのサンプルだと belongs_to な関連でのn+1でしか使えない
issuesにいい感じのLoader実装が載ってる
https://github.com/Shopify/graphql-batch/issues/24
https://gist.github.com/theorygeek/a1a59a2bf9c59e4b3706ac68d12c8434
ぼくがかんがえるさいきょうのloader
https://github.com/yamatatsu/graphql-ruby-playground/blob/master/app/graphql/association_loader.rb
总结
GraphQL很棒。
再掲 – 再次发布
-
- 名前:やまたつ
-
- 会社:giftee
rails5.1, graphql, react, aws, docker
場所:五反田駅から徒歩3分
フレックスタイム
エンジニア募集中
お気軽にmeet upにご参加下さい
6/30(金)開催!
6/23(金)締め切り!
今回のテーマはメキシカン!!
仕事:rails書いたりfront書いたり