11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】【react】jettyサーバーでreactをserver side renderingしてみた

Last updated at Posted at 2015-04-28

今回書くこと

Nashorn使ってreactをserver side renderingやってみたらさくっと動いたのでメモ。

つかったもの

・Jetty(軽量アプリケーションサーバ)
image

・thymeleaf(おすすめテンプレートエンジン)
image

・React
image

内容

準備

  • jettyを組み込んだプロジェクトを作っておく
  • react.jsのスターターキットみたいなのをダウンロードしておく

ポイント

AbstractHandlerをextendsしたとこで、
Thymeleafのテンプレートエンジンと、reactを読み込んだスクリプトエンジンを初期化しておく。

JettyHandler.java
	protected void doStart() throws Exception {
		// Thymeleaf
		ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
		resolver.setTemplateMode("HTML5");
		resolver.setPrefix("html/");
		resolver.setSuffix(".html");
		resolver.setCharacterEncoding(CHARSET);
		resolver.setCacheTTLMs(3600000L);
		resolver.setCacheable(!JavaInJettyProperties.getBoolean(Name.DEVELOP));
		templateEngine = new TemplateEngine();
		templateEngine.setTemplateResolver(resolver);

		// script engine
		manager = new ScriptEngineManager();
		engine = manager.getEngineByName("react");
		engine.eval(new FileReader("src/main/resouces/build/react.js"));
		
		super.doStart();
	}

動くかどうかの確認なのでThymeleafではこんな感じ。
clientでもreactしたいときはreactを読み込んでおく必要ありますね。

index.html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8"/>
		<title>index</title>
	</head>
	<body>
		<div id="contents" th:utext="${content}"></div>
	</body>
</html>

あとは、react使ってサーバーサイドでレンダリング。
オーバーライドしたhandleメソッドでどうぞ。
メソッド名が意味不明になりましたが、いいんです、単なる確認ですから。
本当に使うときにはちゃんと書いて下さい。外部ファイル読込とか作る感じかと思います。

JettyHandler.java
()ルーティングとか色々~~

final Context ctx = new Context();				
engine.eval(getComponentString());
ctx.setVariable("content", engine.eval(getRenderString("Hello world!!")));
				
templateEngine.process("index", ctx, response.getWriter());
JettyHandler.java
	private String getComponentString(){
		return 
		"var MyComponent = React.createClass({" +
				"render: function() {" +"return React.DOM.div(null, this.props.text)" +"}" +
		"});";
	}

JettyHandler.java
	private String getRenderString(String text){
		return
			"React.renderToString(React.createFactory(MyComponent)({" +"text: '" + text + "'" + "}))";
	}

あとがき

簡単に動かすとこまでできました。

実際使う場合は外部ファイルを読み込んで、とか
jsxで記載したものを変換するところを自動化して、とか
やんなきゃいけないことがいくつかありますが、目新しいことはなさそうですね。

jetty+Thymeleaf+reactって上手くいくのか不明でしたがやってみた感じ、
この組み合わせ、何か良い感じになりそう。

NashornではJavaScriptがJavaバイトコードになっているらしく、
パフォーマンスも良いです。

機会があれば使いやすいベースを作って使いこんでみたいです。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?