Missing Pages:
ReactJS/Flux/GraphQL/RelayJS
Khor, @neth_6, re:Culture
FBのドックで書いてない説明
アジェンダ
● ピユアなFluxの使い方
● GraphQL
○ RelayJSなし
○ NodeJSサーバーではないの GraphQLセットアップ
● RelayJS
○ ReactJS: カプリングを下げて, リユースを上げる
○ RelayJSとGraphQLのシナジー
○ NodeJSサーバーではないの RelayJS/GraphQLセットアップ
Reactのファミリー: 一言で ...
● ReactJS: UIデーターとレンダリング
● Flux: データーフロー とコードのストラクチャー
● GraphQL: シングルAPIエンドポイントデーターアクセス
● RelayJS: Reactコンポーネントのデーターdeclaration&コロケーション
GraphQL: RelayJSなし
GraphQL
GraphQL出来る
APIエンドポイント
シングルエンドポイントで全てのデーターを提供
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
categories: [
{
name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price: 20, stock: 50 },
{ name: ‘Baseball’, price: 5, stock: 30 },
…
],
...
}, …
],
}
GraphQL (cont.)
query {
store(email: "admin@abc.com") {
name,
address
}
}
APIエンドポイント
GraphQL (cont.)
query {
store(email: "admin@abc.com") {
name,
address
}
}
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
}
いらっしゃいませ
Hello Shop
住所: 1-3-1 Aoyama
オンラインショップ
APIエンドポイント
GraphQL (cont.)
query {
store(email: "admin@abc.com") {
categories {
name,
products {
name, price, stock
}
}
}
}
store {
categories: [
{ name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price:, stock: 50 }, …
}, ...
]
}
Hello Shop
APIエンドポイント
GraphQL (cont.)
query {
store(email: "admin@abc.com") {
categories {
name,
products {
name, price, stock
}
}
}
}
store {
categories: [
{ name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price:, stock: 50 }, …
}, ...
]
}
シングル
エンドポイント
階層的な
データー
クライアント
コントロール
クエリー
1ラウンドトリッ
プ
データー
APIエンドポイント
GraphQL: セットアップ
GraphQL: クライアントサーバーモデル
ブラウザ
http(s)
サーバー
GraphQL: オーバーHTTP(S)
ブラウザ
GraphQL
サーバー
バンドル JS
GraphQL
オーバー
http(s)、など.
サーバー
GraphQLオーバーhttp(s)
GraphQLオーバーhttp
GraphQL: Enabling the Server
ブラウザ
GraphQL
サーバー
バンドル JS
サーバー
サーバー
ライブラリ
graphql
GraphQL
スキーマ
ハッシュ
GraphQL
オーバー
http(s)、など.
GraphQL: JS Code
ブラウザ
GraphQL
サーバー
バンドル JS
バンドル
JS
サーバー
サーバー
ライブラリ
graphql
GraphQL
スキーマ
ハッシュ
GraphQL
オーバー
http(s)、など.
GraphQL: Required JS Libraries
ブラウザ
バンドルJS
バンドル
JS
サーバー
JSライブラリ
react
react-dom
graphql
GraphQL
オーバー
http(s)、など.
GraphQL
サーバー
サーバー
ライブラリ
graphql
GraphQL
スキーマ
ハッシュ
GraphQL: Bundling Your JS Code
ブラウザ
バンドル JS
バンドル
JS
サーバー
JSライブラリ
react
react-dom
graphql
自分の
JS
GraphQL
オーバー
http(s)、など.
GraphQL
サーバー
サーバー
ライブラリ
graphql
browserify/w
ebpackGraphQL
スキーマ
ハッシュ
ReactJS (レビュー)
ReactJS
Courtesy: https://facebook.github.io/react/docs/thinking-in-react.html
Hello Shop
ReactJS (続き。。。)
Hello Shop
ReactJS (続き。。。)
Hello Shop
React (続き。。。)
Hello Shop
階層的なビュー => GraphQL 階層的なデーター
ReactJS (続き。。。)
アブストラックション
各ReactJSコンポーネントが理解なこと:
● 自分のデーター
● 自分のレンダリング
● チルドレンに一部分のデーターを渡す
React (続き。。。)
Fetch
Data
Hello Shop
React (続き。。。)
Hello Shop
React (続き。。。)
Hello Shop
チルドレンにデーターを渡す
this.props = {
store:
name: ‘Hello Shop’
categories: [
{
name: 'Sporting Goods',
items: [
{ name: 'Football', price: … }
…
],
},
...
],
},
}
データーとレンダリング
this.props.store.name
渡す
this.props.store.categories
そんなTight Coupling, High Reuse ではない
● 親はチルドレンの データーを知るのが必要
○ チルドレンのデーターをフェッチ
○ チルドレンの渡すのデーター部分を理解する
render() {
return (
<Store>{this.props.store} />
<Categories categories={this.props.store.categories} />
)
}
RelayJS: コンポーネント・データーコロケーション
カプリングを下げて、リユースを上げる
GraphQL
GraphQL出来る
シングルエンドポイントで全てのデーターを提供
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
categories: [
{
name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price: 20, stock: 50 },
{ name: ‘Baseball’, price: 5, stock: 30 },
…
],
...
}, …
],
}
APIエンドポイント
サンプルアップ
Hello Shop
サンプルアップ: 簡単化
Hello Shop
RelayJS:コンポーネント・データーコロケーション
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
categories: [
{
name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price: 20, stock: 50 },
{ name: ‘Baseball’, price: 5, stock: 30 },
…
],
...
}, …
],
}
fragment on Store {
name,
address
}
Hello Shop
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
categories: [
{
name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price: 20, stock: 50 },
{ name: ‘Baseball’, price: 5, stock: 30 },
…
],
...
}, …
],
}
fragment on Store {
categories {
name,
products,
}
}
RelayJS:コンポーネント・データーコロケーション
store(email: “admin@abc.com”) {
name: ‘Hello Shop’,
address: ‘1-3-1 Aoyama’
categories: [
{
name: ‘Sporting Goods’,
products: [
{ name: ‘Football’, price: 20, stock: 50 },
{ name: ‘Baseball’, price: 5, stock: 30 },
…
],
...
}, …
],
}
Hello Shop
RelayJSは
各コンポーネントのデー
ターをフェッチ
チルドレンにデーターを渡す
this.props = {
store:
name: ‘Hello Shop’
categories: [
{
name: 'Sporting Goods',
items: [
{ name: 'Football', price: … }
…
],
},
...
],
},
}
データーとレンダリング
this.props.store.name
渡す
this.props.store.categories
そんなTight Coupling, High Reuse ではない
● 親はチルドレンの データーを知るのが必要ない
○ チルドレンのデーターをフェッチ
○ チルドレンの渡すのデーター部分を理解する
render() {
return (
<Store>{this.props.store} />
<Categories categories={this.props.store.categories} />
)
}
RelayJS: GraphQLとのシナジー
なぜRelayJS?
● フィーチャー:
○ コンポーネント・データーコロケーション
○ Connection Id: データー再フィッチ
○ Connections: One-to-Many 関係・プージネション
○ Mutations: データー変更があったとき Reactコンポーネントを自動アップデート
● 暗黙なフィーチャー:
○ 自動データーフィッチ (AJAXコードなしで)
○ データーキャッシュとバッチフィッチ
● 面白いフィーチャー:
○ ロード中のスピナー
○ データーフェッチ失敗な実行なコード
○ オプチミスチックUIアップデート
RelayJS: セットアップ
RelayJS:コンポーネント・データーコロケーション
ブラウザ
GraphQL
/RelayJS
サーバー
バンドル JS
サーバー
JSライブラリ
react
react-dom
react-relay
babelify-relay-
plugin
babelify
RelayJS コンテナ
GraphQL
オーバー
http(s)、など
graphql
サーバーライ
ブラリ
graphql
自分の
JS と
Relay.QL
browserify/w
ebpack
GraphQL
スキーマ
JSON
バンドル
JS
GraphQL
スキーマ
ハッシュ
コンバーター
graphql-relay
参考
● 記事
○ GraphQL/RelayJS (non NodeJS): https://medium.com/@khor/relay-facebook-on-rails-8b4af2057152
○ Pure ‘Flux’ (non NodeJS): https://medium.com/@khor/back-to-front-rails-to-facebook-s-flux-ae815f81b16c
● スタータキット
○ Rails: https://github.com/nethsix/relay-on-rails
● チョイス: React, React (with Container), Flux/Redux, GraphQL/RelayJS
○ Shared by @koba04 - http://andrewhfarmer.com/react-ajax-best-practices/
● フォロー: @neth_6, @reculture_us
ありがとう:
● みんな!
● koba04!
● Facebookエンジニア!

Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS