GraphQLリテラシーを高め
武器を増やし
各自が適切な判断を下せるようになる為
情報検索の為のQueryの木を構築
データ操作の為のMutationの木を構築
それらをSchemaという木の部分木として持つ
この例だと、Schema木には部分木としてQueryしかいないのがわかる
つまり、データ検索しかできなく、データ操作が不可
この様に、QueryとMutationを必ずセットで提供しなくても良い
type Author {
id: Int!
firstName: String!
lastName: String!
posts(findTitle: String): [Post]
}
type Post {
id: Int!
title: String!
author: Author!
}
type Query {
posts: [Post]
}
schema {
query: Query
}
Schemaを定義したらそのSchemaを前提にした操作を記述できる
これは静的・動的に記述できる
この操作はOperationと呼ばれている (英訳そのまま
@で始まる印を付ける
デコレータみたいなもの
どんな処理がされるかはSchemaからはわからないので命名と型定義が重要
他の部分も基本的に最終的にはPremitiveな値が返って来るぐらいしか定義できていない
ので、そんなものかもしれない
directive @deprecated(
reason: String = "No longer supported"
) on FIELD_DEFINITION | ENUM_VALUE
type ExampleType {
newField: String
oldField: String @deprecated(reason: "Use `newField`.")
}
operationさえ解決できれば何でもok
同一プロセスでも良いし、実際同一プロセスにengineとclient同梱のアプリも割とある
operation textとvariablesをengineに与えて計算させる。
engineは基本的に誰かが作った便利なライブラリがあって、それらはresolverを要求する実装が多い
engineはmiddlewareを設定できたり、operation textを解析して対応するresolverに処理の移譲をする実装が多い
resolverはschema忠実なresolverの実装が必須
これはフロントが
Vue.jsとapollo link state
バックエンドがgraphql ruby
の図
フロントが一度operationを構文解析し、フロント側のresolver又はcache機構で解決可能なoperationならそこで解決する。
解決できないoperationならHTTP等を利用してサーバー側にoperationの解決を依頼し、その結果をフロント側で利用する
Hands on参考資料
https://qiita.com/mizchi/items/fb9f598cea94d2c8072d
$ mkdir graphql-handson
$ cd graphql-handson
$ npm init
// 作業内容をgit管理したい方はどうぞ
$ git init
$ brew install gibo
$ gibo dump macOs node > .gitignore
// -----------
$ touch codegen.yml
$ mkdir ./graphql
$ touch ./graphql/schema.graphql
$ yarn add graphql @graphql-codegen/cli @graphql-codegen/typescript
overwrite: true
schema:
- ./graphql/schema.graphql # or - http://localhost:3000/graphql
generates:
./client/gen/graphql-client-api.ts:
plugins:
- typescript
schema.graphqlファイルに定義してください
挑戦したい方は自由に書いてください
初めてであまりよくわからない方は上に貼ってあるGraphQL-codegenのSchemaを参考に書いてみてください
参考にすると良いサイト
Custom scalar typeの定義
type Author {
id: ID!
firstName: String!
lastName: String!
posts(findTitle: String): [Post]
}
type Post {
id: ID!
title: String!
author: Author!
}
type Query {
posts: [Post]
}
schema {
query: Query
}
$ yarn graphql-codegen --config codegen.yml
$ yarn graphql-codegen --config codegen.yml
RESTの場合だとURLとHTTP Methodをセットにして、resolverならずcontrollerに処理を投げている
なので、GraphQLを使ったからと言ってエンドポイントの設計はなくならないし、無計画に量産してはならない
あくまでもGraphQLのルールのおかげでRESTだと実装が難しかった物がGraphQLの明確なレールやエコシステムのおかげで簡単になっているだけであり、それらを活かさないとGraphQLを使っている意味が殆どなくなる
柔軟でメンテナンスビリティの高い開発をサポートするためにGraphQLに寄り添う。
GraphQLのスタックを導入しただけでは、柔軟でメンテナンスビリティの高いシステムは手に入らない。
(Redux, Vuex, Component system, その他同様。
GraphQLでSchemaを定義 or しない
front側にclientもresolverも設置
clientのrequestをfirestoreに飛ばし、responseをformatに沿って直す
エラーやバグが出た際の特定難しい
黒魔術感あってメンテむずい
AppSyncの方がマシ
※ AppSync登場前に巷でチラホラ流行っていたネタ
@clientディレクティブをqueryとかmutationに付けて、client側でそれを解決をする
Schemaはclient用のを定義すれば、codegenでclient用のコード出力が可能
用途としてはReduxやVuexをやめて、GraphQL、Apollo1本で行こう!って感じ
query myQuery {
todos {
id
title
checked
selected @client
}
}
query {
user(id: 1) @client {
name {
last
first
}
}
}