SlideShare a Scribd company logo
Java + React.jsで
Sever Side Rendering
2015-04-24 React.js meetup #1 LT
Toshiaki Maki (@making)
自己紹介
• @making
• Java界隈にいます
• Spring Framework好き
自己紹介
• @making
• Java界隈にいます
• Spring Framework好き
「はじめてのSpring Boot」
著者
自己紹介
• @making
• Java界隈にいます
• Spring Framework好き
「はじめてのSpring Boot」
著者
Spring IO 2015スピーカー
私とServer Side Rendering
• SPAでブログ作った!
http://blog.ik.am
私と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
_人人人人人人人_
> ググれない <
 ̄Y^Y^Y^Y^Y^Y ̄
_人人人人人人人_
> ググれない <
 ̄Y^Y^Y^Y^Y^Y ̄
アフィリエイト収入が
1/4に😭
はてブ
はてブ
_人人人人人人人_
> Loading... <
 ̄Y^Y^Y^Y^Y^Y ̄
Sever Side Rendering
やるしかない!
SSR候補
•Prerender
•Rendr (Backbone.js)
•React.js
SSR候補
•Prerender
•Rendr (Backbone.js)
•React.js
採用理由:
流行っているから
React.jsで SSR?
React.jsで SSR?
それJavaでもできるよ
JavaScript Engine in Java
• ScriptEngine API (JSR-223)
• Java SE 6, 7 … Rhino
• Java SE 8 … Nashorn
JavaScript Engine in Java
• ScriptEngine API (JSR-223)
• Java SE 6, 7 … Rhino
• Java SE 8 … Nashorn
JavaとJavaScriptの関係は
インドとインドネシア
の関係ほど単純じゃない
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
ScriptEngineを使って
Sever Side Rendering
V8バインディング
いらず!
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} /> 

); 

};
React.js側のコード
var App = React.createClass({ 

render: function () { 

return ( 

<div> 

<h1>React.js</h1> 

<Greet 

data={this.props.data} /> 

</div> 

); 

} 

}); サーバーサイドで用意さ
れたデータが渡される
React.js側のコード
var Greet = React.createClass({ 

getInitialState: function () { 

return this.props.data || 

{id: 0, content: 'Now Loading...'}; 

}, 

// … 

});
getInitialState()でサーバー
で用意したデータを返す
サーバーサイド// 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";                        

}
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を埋め込む
componentDidMount (Ajax)
SSRできた!
JSも評価されてる
ということで
フロントを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
ぐぐれ・・・・
ぐぐれとるやん
ん?
ん?
ブログのフロントエンドは
React.jsで書いてみたけど
SSR対応はまだだった!!
ん?
ブログのフロントエンドは
React.jsで書いてみたけど
SSR対応はまだだった!!
Google先生が優秀だった
まとめ
• NashornがあればJavaでも
サーバーサイドレンダリングで
きた
• Google先生はSPAに対応して
いた 今日のソースコード
https://github.com/making/ssr-demo

More Related Content

PDF
Androidの新ビルドシステム
PDF
"Simple Made Easy" Made Easy
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
PPTX
async/await のしくみ
PDF
Cognitive Complexity でコードの複雑さを定量的に計測しよう
PPTX
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
PPTX
Stack pivot
Androidの新ビルドシステム
"Simple Made Easy" Made Easy
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
FridaによるAndroidアプリの動的解析とフッキングの基礎
async/await のしくみ
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
Stack pivot

What's hot (20)

PPTX
良いコードとは
PDF
ゲーム開発者のための C++11/C++14
PPTX
BuildKitによる高速でセキュアなイメージビルド
PDF
Web エンジニアが postgre sql を選ぶ 3 つの理由
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PPTX
[CEDEC2017] LINEゲームのセキュリティ診断手法
PDF
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PDF
Docker国内外本番環境サービス事例のご紹介
PDF
できる!並列・並行プログラミング
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
PDF
大規模Redisサーバ縮小化の戦い
PDF
パターンでわかる! .NET Coreの非同期処理
PDF
イミュータブルデータモデルの極意
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
MagicOnion~C#でゲームサーバを開発しよう~
PPTX
C#メタプログラミング概略 in 2021
PDF
Json型の使い方
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
Docker Tokyo
PDF
Unified JVM Logging
良いコードとは
ゲーム開発者のための C++11/C++14
BuildKitによる高速でセキュアなイメージビルド
Web エンジニアが postgre sql を選ぶ 3 つの理由
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
[CEDEC2017] LINEゲームのセキュリティ診断手法
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
Docker国内外本番環境サービス事例のご紹介
できる!並列・並行プログラミング
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
大規模Redisサーバ縮小化の戦い
パターンでわかる! .NET Coreの非同期処理
イミュータブルデータモデルの極意
ドメイン駆動設計のための Spring の上手な使い方
MagicOnion~C#でゲームサーバを開発しよう~
C#メタプログラミング概略 in 2021
Json型の使い方
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Docker Tokyo
Unified JVM Logging
Ad

Viewers also liked (20)

PDF
Flowtype Introduction
PDF
React系(別言語含む)の サーバーサイドレンダリング について考えよう
PPTX
React を導入した フロントエンド開発
PDF
なぜ人は必死でjQueryを捨てようとしているのか
PDF
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
PDF
Tokyo React.js #3: Missing Pages: ReactJS/Flux/GraphQL/RelayJS
PPTX
React meetup 3_eight
PDF
まだ DOM 操作で消耗してるの?
PDF
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
PDF
Lineにおけるspring frameworkの活用
PDF
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
PPTX
今からでも遅くない! React事始め
PDF
Hastening React SSR - Web Performance San Diego
PDF
【未発表】Backbone.jsとJavaEE7でWebアプリを作ろう!(第1回) 〜GETで一覧編〜
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
Japanese Introduction to Oracle JET
PPTX
Oracleがnode.jsをやり始めたというのだが!
PDF
Nashorn in the future (English)
PDF
Our wish to Flowtype
PPTX
20160927 reactmeetup
Flowtype Introduction
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React を導入した フロントエンド開発
なぜ人は必死でjQueryを捨てようとしているのか
Tokyo React.js #3 Meetup (ja): Missing Pages: ReactJS/GraphQL/RelayJS
Tokyo React.js #3: Missing Pages: ReactJS/Flux/GraphQL/RelayJS
React meetup 3_eight
まだ DOM 操作で消耗してるの?
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Lineにおけるspring frameworkの活用
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
今からでも遅くない! React事始め
Hastening React SSR - Web Performance San Diego
【未発表】Backbone.jsとJavaEE7でWebアプリを作ろう!(第1回) 〜GETで一覧編〜
WildFly Swarmではじめる「パーツとしてのJavaEE」
Japanese Introduction to Oracle JET
Oracleがnode.jsをやり始めたというのだが!
Nashorn in the future (English)
Our wish to Flowtype
20160927 reactmeetup
Ad

Similar to Java + React.jsでSever Side Rendering #reactjs_meetup (20)

PDF
Spring Bootキャンプ @関ジャバ #kanjava_sbc
PDF
Svgアニメーションを実装してみよう 20150207
PDF
Spring.project
PPTX
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
PDF
Javaと小道具
PPTX
Railsのフロントエンド開発を考える
PDF
Javaな人が気を付けるべきJavaScriptコーディングスタイル
PDF
2015/11/15 Javaでwebアプリケーション入門
PDF
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
PDF
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
PDF
とりあえず使えるSBT
PDF
Ruby on Railsではじめるrspecテスト
PDF
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
PDF
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
PDF
【LT】 怖くない恐怖のScala.js
PDF
実戦Scala
PDF
Javaアプリケーション開発におけるユニットテストとTDDの実践 Java Day Tokyo 2014
PPTX
普段Reactを触ってる僕が Angularを触ってみた感想を共有する
PDF
Practical migration from JSP to Thymeleaf
PDF
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Svgアニメーションを実装してみよう 20150207
Spring.project
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
Javaと小道具
Railsのフロントエンド開発を考える
Javaな人が気を付けるべきJavaScriptコーディングスタイル
2015/11/15 Javaでwebアプリケーション入門
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc.
とりあえず使えるSBT
Ruby on Railsではじめるrspecテスト
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
JavaエンタープライズアーキテクチャにおけるHTML5 - Enterprise ☓ HTML5 Web Application Conference ...
【LT】 怖くない恐怖のScala.js
実戦Scala
Javaアプリケーション開発におけるユニットテストとTDDの実践 Java Day Tokyo 2014
普段Reactを触ってる僕が Angularを触ってみた感想を共有する
Practical migration from JSP to Thymeleaf
『健全なフロントエンド開発をしよう 〜Railsに乗っかるという選択編〜』 アップ用

More from Toshiaki Maki (20)

PDF
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
PDF
Concourse x Spinnaker #concourse_tokyo
PDF
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
PDF
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
PDF
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
PDF
Spring Boot Actuator 2.0 & Micrometer
PDF
Open Service Broker APIとKubernetes Service Catalog #k8sjp
PDF
Spring Cloud Function & Project riff #jsug
PDF
Introduction to Spring WebFlux #jsug #sf_a1
PDF
BOSH / CF Deployment in modern ways #cf_tokyo
PDF
Why PCF is the best platform for Spring Boot
PDF
Zipkin Components #zipkin_jp
PPTX
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
PDF
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
PDF
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
PDF
Spring ❤️ Kotlin #jjug
PDF
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
PDF
Managing your Docker image continuously with Concourse CI
PDF
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
PDF
Short Lived Tasks in Cloud Foundry #cfdtokyo
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
Concourse x Spinnaker #concourse_tokyo
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Spring Cloud Function & Project riff #jsug
Introduction to Spring WebFlux #jsug #sf_a1
BOSH / CF Deployment in modern ways #cf_tokyo
Why PCF is the best platform for Spring Boot
Zipkin Components #zipkin_jp
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
実例で学ぶ、明日から使えるSpring Boot Tips #jsug
Spring ❤️ Kotlin #jjug
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Managing your Docker image continuously with Concourse CI
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Short Lived Tasks in Cloud Foundry #cfdtokyo

Java + React.jsでSever Side Rendering #reactjs_meetup