Slide 1

Slide 1 text

React & Go Single Page Apps React.jsとGo言語を使ったGunosyのSPA例 Copyright Tsuyoshi Higuchi 2015

Slide 2

Slide 2 text

PROFILE UI Designer, Front-End Engineer, UX Architect Tsuyoshi Higuchi @tyshgc From Gunosy.inc

Slide 3

Slide 3 text

Gunosy Platformの紹介

Slide 4

Slide 4 text

Gunosyでは、基幹となるiOS/Androidアプリ上 にWebViewを設けて、 その中で動作・提供されるマイクロサービスを Platformコンテンツと呼んでいます。

Slide 5

Slide 5 text

旅行検索コンテンツやオペレーター とのチャットを使ったプランの相談 などのサービス。 そのほかに、今年中にいくつかの アプリケーションを提供開始する 予定で開発中です。 WebSocket + React + Goの チャットアプリケーション

Slide 6

Slide 6 text

Server/API Client アプリケーションはこれらで開発 React.js Go言語

Slide 7

Slide 7 text

なぜGo言語だったのか

Slide 8

Slide 8 text

•社内のシステムが既にほぼGo言語になっていた •Go言語はAPI設計を行う上で非常に実装が行いやすい •シンプルに設計ができる •並列処理により処理速度が速い 社内のシステムの多くがGo言語を採用

Slide 9

Slide 9 text

なぜReactだったのか

Slide 10

Slide 10 text

•Component設計を行う上で非常に実装が行いやすい •一方向のデータフローはGUIの流用が行いやすい •シンプルに設計ができる •学習コストが低いのですぐに開発に参加できる ぶっちゃけ使ってみたかった感

Slide 11

Slide 11 text

連携して見えた懸念点

Slide 12

Slide 12 text

APIとJavascriptによるレンダリングは 初期表示に弱い

Slide 13

Slide 13 text

パフォーマンスを考えるとサーバサイド によるレンダリングが必要

Slide 14

Slide 14 text

しかし、Go言語の 標準テンプレートエンジンは つかいにくい

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

結果、こうなった

Slide 17

Slide 17 text

標準テンプレートエンジンを使って、 windowオブジェクトにPRELOAD_DATAを置くようにした React.jsのgetInitialStateでstateに、 window.PRELOAD_DATAを渡した 生DOMをマークアップすることなく、JSX以外のDOMを 触れずに実装できた

Slide 18

Slide 18 text

Html:jade doctype html html head meta(charset="utf-8") link(type="text/css", rel="stylesheet", media="all", href="/view.css") script. window.PRELOAD_DATA = {{.PreloadData}} ; title block html_title | #{page.siteName} body(role="document") #content.wrap script(type="text/javascript", src="/client.js") Goがjsonをレンダリングする

Slide 19

Slide 19 text

Javascript:React var Component = React.createClass({ getInitialState : function(){ var data = window.PRELOAD_DATA.hoge; return { hogeTitle : data.title, hogeDescription : data.description } }; }); Goがレンダリングしたjsonを受け取る

Slide 20

Slide 20 text

WebAPI PRELOAD DATA ServerSideRender View Get JSON Action Dispatcher Store View Intaraction Action Ajax InfiniteScrollͳͲ௥ՃͰσʔλΛऔಘ͢Δࡍ͸Action͔ΒAjaxͰऔಘ … Golang … React.js … Flux

Slide 21

Slide 21 text

まとめ

Slide 22

Slide 22 text

WebViewアプリケーションで、SEOを考えなくても 良いのでIsomorphicである必要はなかった React.js自体のファイルサイズの問題はあるが、 大きなサービスでないのでそれほどパフォーマンス は損なわなかった レンダリングのタイミングを気をつければ、 非同期時のパフォーマンスも決して悪くない

Slide 23

Slide 23 text

React-Routerを採用してpushStateを行っているの でサーバサイド側の再描画は必要ない チームメンバーがJavascriptを書けることもネック になるが、React(JSX)の学習コストは低いので 問題なし GunosyPlatformは対応範囲がiOS 7以上, Android 4以上なので気になるバグはなかった。

Slide 24

Slide 24 text

ちなみに…

Slide 25

Slide 25 text

Go言語 + React.jsでIsomorphicを 実現している例があった。 https://github.com/olebedev/go-react-example go-duktapeを使ってJavascriptをバインディングしているようだ

Slide 26

Slide 26 text

最後に…

Slide 27

Slide 27 text

株式会社グノシーでは フロントエンドエンジニアを 絶賛募集中です!