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 是什么?

RESTfulgraphQLエンドポイントいっぱい基本1つ呼び出し回数多くなりがち1回でいろんな情報が取れる条件文urlパラメータクエリで書けるHTTPメソッドGet, Post, Put, DeletePost

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書いたり


谢谢各位的倾听。

广告
将在 10 秒后关闭
bannerAds