tokyo react.js #3 meetup (ja): missing pages: reactjs/graphql/relayjs

44
Missing Pages: ReactJS/Flux /GraphQL/RelayJS Khor, @neth_6, re:Culture

Upload: khor-soonhin

Post on 21-Jan-2017

2.018 views

Category:

Technology


3 download

TRANSCRIPT

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

Missing Pages: ReactJS/Flux/GraphQL/RelayJS

Khor, @neth_6, re:Culture

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

FBのドックで書いてない説明

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

アジェンダ

● ピユアなFluxの使い方

● GraphQL○ RelayJSなし

○ NodeJSサーバーではないのGraphQLセットアップ

● RelayJS○ ReactJS: カプリングを下げて , リユースを上げる

○ RelayJSとGraphQLのシナジー

○ NodeJSサーバーではないのRelayJS/GraphQLセットアップ

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

Reactのファミリー: 一言で ...● ReactJS: UIデーターとレンダリング

● Flux: データーフロー とコードのストラクチャー

● GraphQL: シングルAPIエンドポイントデーターアクセス ● RelayJS: Reactコンポーネントのデーターdeclaration&コロケーション

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

GraphQL: RelayJSなし

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

GraphQL

GraphQL出来る

APIエンドポイント

シングルエンドポイントで全てのデーターを提供

store(email: “[email protected]”) { 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 }, … ], ... }, … ],}

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

GraphQL (cont.)query { store(email: "[email protected]") { name, address }}

APIエンドポイント

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

GraphQL (cont.)query { store(email: "[email protected]") { name, address }}

store(email: “[email protected]”) { name: ‘Hello Shop’, address: ‘1-3-1 Aoyama’}

いらっしゃいませHello Shop

住所: 1-3-1 Aoyama オンラインショップAPIエンドポイント

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

GraphQL (cont.)query { store(email: "[email protected]") { categories { name, products { name, price, stock } } }}

store { categories: [ { name: ‘Sporting Goods’, products: [ { name: ‘Football’, price:, stock: 50 }, … }, ... ]}

Hello Shop

APIエンドポイント

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

GraphQL (cont.)query { store(email: "[email protected]") { categories { name, products { name, price, stock } } }}

store { categories: [ { name: ‘Sporting Goods’, products: [ { name: ‘Football’, price:, stock: 50 }, … }, ... ]}

シングルエンドポイント

階層的なデーター

クライアントコントロールクエリー

1ラウンドトリップ

データー

APIエンドポイント

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

GraphQL: セットアップ

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

GraphQL: クライアントサーバーモデル

ブラウザ

http(s)

サーバー

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

GraphQL: オーバーHTTP(S)

ブラウザ

GraphQLサーバー

バンドル JS

GraphQLオーバー

http(s)、など.

サーバー

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

GraphQLオーバーhttp(s)

GraphQLオーバーhttp

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

GraphQL: Enabling the Server

ブラウザ

GraphQLサーバー

バンドル JSサーバー

サーバーライブラリ

graphqlGraphQL スキーマハッシュ

GraphQLオーバー

http(s)、など.

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

GraphQL: JS Code

ブラウザ

GraphQLサーバー

バンドル JS

バンドル JS

サーバー

サーバーライブラリ

graphqlGraphQL スキーマハッシュ

GraphQLオーバー

http(s)、など.

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

GraphQL: Required JS Libraries

ブラウザ

バンドルJS

バンドルJS

サーバー

JSライブラリ

reactreact-domgraphql

GraphQLオーバー

http(s)、など.GraphQLサーバー

サーバーライブラリ

graphqlGraphQL スキーマハッシュ

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

GraphQL: Bundling Your JS Code

ブラウザ

バンドル JS

バンドル JS

サーバー

JSライブラリ

reactreact-domgraphql

自分の JS

GraphQLオーバー

http(s)、など.GraphQLサーバー

サーバーライブラリ

graphql

browserify/webpackGraphQL

スキーマハッシュ

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

ReactJS (レビュー)

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

ReactJS

Courtesy: https://facebook.github.io/react/docs/thinking-in-react.html

Hello Shop

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

ReactJS (続き。。。)Hello Shop

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

ReactJS (続き。。。)Hello Shop

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

React (続き。。。)Hello Shop

階層的なビュー => GraphQL 階層的なデーター

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

ReactJS (続き。。。)アブストラックション

各ReactJSコンポーネントが理解なこと:

● 自分のデーター

● 自分のレンダリング

● チルドレンに一部分のデーターを渡す

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

React (続き。。。)Fetch Data

Hello Shop

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

React (続き。。。)Hello Shop

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

React (続き。。。)Hello Shop

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

チルドレンにデーターを渡す

this.props = { store: name: ‘Hello Shop’ categories: [ { name: 'Sporting Goods', items: [ { name: 'Football', price: … } … ], }, ... ], },}

データーとレンダリング this.props.store.name

渡すthis.props.store.categories

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

そんなTight Coupling, High Reuse ではない

● 親はチルドレンの データーを知るのが必要○ チルドレンのデーターをフェッチ

○ チルドレンの渡すのデーター部分を理解する

render() { return ( <Store>{this.props.store} /> <Categories categories={this.props.store.categories} /> ) }

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

RelayJS: コンポーネント・データーコロケーション

カプリングを下げて、リユースを上げる

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

GraphQL

GraphQL出来る

シングルエンドポイントで全てのデーターを提供

store(email: “[email protected]”) { 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エンドポイント

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

サンプルアップ

Hello Shop

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

サンプルアップ: 簡単化

Hello Shop

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

RelayJS:コンポーネント・データーコロケーションstore(email: “[email protected]”) { 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

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

store(email: “[email protected]”) { 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:コンポーネント・データーコロケーション

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

store(email: “[email protected]”) { 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は各コンポーネントのデーターをフェッチ

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

チルドレンにデーターを渡す

this.props = { store: name: ‘Hello Shop’ categories: [ { name: 'Sporting Goods', items: [ { name: 'Football', price: … } … ], }, ... ], },}

データーとレンダリング this.props.store.name

渡すthis.props.store.categories

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

そんなTight Coupling, High Reuse ではない

● 親はチルドレンの データーを知るのが必要ない○ チルドレンのデーターをフェッチ

○ チルドレンの渡すのデーター部分を理解する

render() { return ( <Store>{this.props.store} /> <Categories categories={this.props.store.categories} /> ) }

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

RelayJS: GraphQLとのシナジー

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

なぜRelayJS?● フィーチャー:

○ コンポーネント・データーコロケーション

○ Connection Id: データー再フィッチ

○ Connections: One-to-Many 関係・プージネション

○ Mutations: データー変更があったとき Reactコンポーネントを自動アップデート

● 暗黙なフィーチャー:○ 自動データーフィッチ (AJAXコードなしで)○ データーキャッシュとバッチフィッチ

● 面白いフィーチャー:○ ロード中のスピナー

○ データーフェッチ失敗な実行なコード

○ オプチミスチックUIアップデート

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

RelayJS: セットアップ

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

RelayJS:コンポーネント・データーコロケーション

ブラウザ

GraphQL/RelayJSサーバー

バンドル JSサーバー

JSライブラリ

reactreact-dom

react-relay

babelify-relay-plugin

babelify

RelayJS コンテナ GraphQLオーバー

http(s)、など

graphql

サーバーライブラリ

graphql

自分の JS と

Relay.QL

browserify/webpack

GraphQL スキーマ

JSON

バンドル JS

GraphQL スキーマハッシュ

コンバーター

graphql-relay

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

参考

● 記事○ 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

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

ありがとう:● みんな!● koba04!● Facebookエンジニア!