java + react.jsでsever side rendering #reactjs_meetup

32
Java + React.jsで Sever Side Rendering 2015-04-24 React.js meetup #1 LT Toshiaki Maki (@making)

Upload: toshiaki-maki

Post on 15-Jul-2015

6.209 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Java + React.jsでSever Side Rendering #reactjs_meetup

Java + React.jsで Sever Side Rendering2015-04-24 React.js meetup #1 LT

Toshiaki Maki (@making)

Page 2: Java + React.jsでSever Side Rendering #reactjs_meetup

自己紹介•@making

•Java界隈にいます

•Spring Framework好き

Page 3: Java + React.jsでSever Side Rendering #reactjs_meetup

自己紹介•@making

•Java界隈にいます

•Spring Framework好き

「はじめてのSpring Boot」 著者

Page 4: Java + React.jsでSever Side Rendering #reactjs_meetup

自己紹介•@making

•Java界隈にいます

•Spring Framework好き

「はじめてのSpring Boot」 著者

Spring IO 2015スピーカー

Page 5: Java + React.jsでSever Side Rendering #reactjs_meetup

私とServer Side Rendering• SPAでブログ作った!

http://blog.ik.am

Page 6: Java + React.jsでSever Side Rendering #reactjs_meetup

私とServer Side Rendering• SPAでブログ作った!

Backend API

(Java)

Frontend SPA

(Backbone.js)

Backend SPA

(Backbone.js)

REST API

REST API

http://blog.ik.am

https://github.com/making/categolj2-backend

Page 7: Java + React.jsでSever Side Rendering #reactjs_meetup

_人人人人人人人_ > ググれない < ‾Y^Y^Y^Y^Y^Y‾

Page 8: Java + React.jsでSever Side Rendering #reactjs_meetup

_人人人人人人人_ > ググれない < ‾Y^Y^Y^Y^Y^Y‾

アフィリエイト収入が 1/4に😭

Page 9: Java + React.jsでSever Side Rendering #reactjs_meetup

はてブ

Page 10: Java + React.jsでSever Side Rendering #reactjs_meetup

はてブ

_人人人人人人人_ > Loading... < ‾Y^Y^Y^Y^Y^Y‾

Page 11: Java + React.jsでSever Side Rendering #reactjs_meetup

Sever Side Rendering やるしかない!

Page 12: Java + React.jsでSever Side Rendering #reactjs_meetup

SSR候補

•Prerender •Rendr (Backbone.js) •React.js

Page 13: Java + React.jsでSever Side Rendering #reactjs_meetup

SSR候補

•Prerender •Rendr (Backbone.js) •React.js 採用理由:

流行っているから

Page 14: Java + React.jsでSever Side Rendering #reactjs_meetup

React.jsで SSR?

Page 15: Java + React.jsでSever Side Rendering #reactjs_meetup

React.jsで SSR?

それJavaでもできるよ

Page 16: Java + React.jsでSever Side Rendering #reactjs_meetup

JavaScript Engine in Java

• ScriptEngine API (JSR-223)

• Java SE 6, 7 … Rhino

• Java SE 8 … Nashorn

Page 17: Java + React.jsでSever Side Rendering #reactjs_meetup

JavaScript Engine in Java

• ScriptEngine API (JSR-223)

• Java SE 6, 7 … Rhino

• Java SE 8 … Nashorn

JavaとJavaScriptの関係はインドとインドネシア の関係ほど単純じゃない

Page 18: Java + React.jsでSever Side Rendering #reactjs_meetup

ScriptEngine

ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("js"); engine .eval("function sum(a,b){return a + b;}"); System.out.println(engine.eval("sum(1,2);")); // 3

http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

Page 19: Java + React.jsでSever Side Rendering #reactjs_meetup

ScriptEngineを使って Sever Side Rendering

V8バインディングいらず!

Page 20: Java + React.jsでSever Side Rendering #reactjs_meetup

React.js側のコードwindow.renderOnClient = function (initialData) { React.render( <App data={initialData} />, document.getElementById('content') ); }; window.renderOnServer = function (initialData) { //initialData = Java.from(initialData); Listの場合 return React.renderToString( <App data={initialData} /> ); };

Page 21: Java + React.jsでSever Side Rendering #reactjs_meetup

React.js側のコードvar App = React.createClass({ render: function () { return ( <div> <h1>React.js</h1> <Greet data={this.props.data} /> </div> ); } }); サーバーサイドで用意さ

れたデータが渡される

Page 22: Java + React.jsでSever Side Rendering #reactjs_meetup

React.js側のコード

var Greet = React.createClass({ getInitialState: function () { return this.props.data || {id: 0, content: 'Now Loading...'}; }, // … });

getInitialState()でサーバーで用意したデータを返す

Page 23: Java + React.jsでSever Side Rendering #reactjs_meetup

サーバーサイド// JSONマッパー                           ObjectMapper objectMapper = new ObjectMapper();        // ScriptEngineのラッパー                      ScriptEngine engine = new JavaScriptEngine()          .polyfill()                         .load("static/bundle.js")                 .get();                                                               @RequestMapping("/")                        String index(Model model) throws Exception {          Greet initialData = new Greet(100, "Data on Server");  Object markup = ((Invocable) engine)            .invokeFunction("renderOnServer", initialData); model.addAttribute("markup", markup);            model.addAttribute("initialData",              objectMapper.writeValueAsString(initialData)); return "index";                        }                                   

Page 24: Java + React.jsでSever Side Rendering #reactjs_meetup

HTMLテンプレート(Thymeleaf)

<body> <div id="content" th:utext="${markup}"></div> <script src="bundle.js"></script> <script type="text/javascript" th:inline="javascript"> document.addEventListener("DOMContentLoaded", function () { var initialData = JSON.parse(/*[[${initialData}]]*/ '{"id": -1, "content": "モックデータ"}'); renderOnClient(initialData); }, false); </script> </body> エンジン経由だとコメントの中身が評価される

テンプレートを直で開くとコメントの後ろが評価されるので、フロントエンドに閉じて開発可能!

サーバーで生成したHTMLを埋め込む

Page 25: Java + React.jsでSever Side Rendering #reactjs_meetup

componentDidMount (Ajax)

SSRできた!

JSも評価されてる

Page 26: Java + React.jsでSever Side Rendering #reactjs_meetup

ということで フロントをReact.jsで作り直した

Backend API

(Java)

Frontend SPA

(React.js)

Backend SPA

(Backbone.js)

REST API

REST API

https://github.com/making/categolj2-backend/tree/master/frontend-ui-reactjs

Page 27: Java + React.jsでSever Side Rendering #reactjs_meetup

ぐぐれ・・・・

Page 28: Java + React.jsでSever Side Rendering #reactjs_meetup

ぐぐれとるやん

Page 29: Java + React.jsでSever Side Rendering #reactjs_meetup

ん?

Page 30: Java + React.jsでSever Side Rendering #reactjs_meetup

ん?ブログのフロントエンドはReact.jsで書いてみたけど SSR対応はまだだった!!

Page 31: Java + React.jsでSever Side Rendering #reactjs_meetup

ん?ブログのフロントエンドはReact.jsで書いてみたけど SSR対応はまだだった!!

Google先生が優秀だった

Page 32: Java + React.jsでSever Side Rendering #reactjs_meetup

まとめ•NashornがあればJavaでもサーバーサイドレンダリングできた

•Google先生はSPAに対応していた 今日のソースコード

https://github.com/making/ssr-demo