Introduction to React.js
こんな人が対象
React.jsまわりのワード多すぎて
わかんね
なんでReactなんですか?
jQueryじゃだめなんですか?
React.jsが解決するもの
• コンポーネントという概念を持ち込むことで設
計を改善する
• Virtual DOM採用による設計と速度の両立
• JSフレームワークで問題になりがちなSEOに対
応できる
採用事例
• Facebook
• Instagram
• Yahoo
• Atom Editor(React導入後にVanillaJSで書きな
おした)
• Airbnb
React.jsにまつわるワード
• React Component
• JSX
• Virtual DOM
• Server-Side Rendering
• Flux
React.jsのComponent
jQuery
どこのDOM?
$('#target').click(function() {
$('#output').html(function(i, val) { return val*1+1 });
});
DOMが状態を
持ってしまっている
React.jsvar Counter = React.createClass({
getInitialState() {
return {
count: 0
};
},
onClick() {
this.setState({count: this.state.count + 1});
},
render() {
return (
<div>
<div>count:{this.state.count}</div>
<button onClick={this.onClick}>click!</button>
</div>
);
}
});
DOMの情報もJSで持つ
DOMに対する操作
• DOMとロジックの距離を近づけることでコード
がリーダブルになる
• 実DOMの状態に影響されないのでテスタブルに
なる
• Facebook曰く技術の分離でなく責務で分離した
らこうなるらしい
var Counter = React.createClass({
getInitialState() {
return {
count: 0
};
},
onClick() {
this.setState({count: this.state.count + 1});
},
render() {
return (
<div>
<div>count:{this.state.count}</div>
<button onClick={this.onClick}>click!</button>
</div>
);
}
}); なんかHTMLっぽいのがまざってるんですけど…
ちょっとまて
JSX
• JSの中に HTMLっぽいもの を組み込める
• 事前にコンパイルする必要あり
• 素のJSで書くよりコードが直感的になる
<div className="foo">
<div className="bar">
Hello {this.props.name}
</div>
</div>
React.createElement("div", {className: "foo"},
React.createElement("div", {className: "bar"},
"Hello ", this.props.name
)
)
JSX
JS
• こういったコンポーネントの考え方で設計手法
が確立できた
• ただし設計のためだけにパフォーマンスを犠牲
にできない
• 設計と速度の両立が必要
Virtual
DOM
• JSオブジェクトでDOMを内部で再現する
• データに変更があった場合、Diffを計算し実際の
DOMを部分更新する
• Reactを使う側は特に意識する必要は 基本的 に
ない
• Virtual DOM自体は概念なので実装が色々ある
いろんなVirtual DOM実装
• facebook/react
• Matt-Esch/virtual-dom
• dekujs/deku
• omcljs/om
• Elm
Virtual DOMがあることで
なにが嬉しいの
• jQueryのように自前でDOMに対してパッチを当てなく
ていい
• ユーザは期待するDOMの結果だけを定義すればいい
• しかもいい感じに速い
• 毎回新しくDOMを作って上書きすればコードとDOM
の状態に乖離がなくなる
• ↑これってサーバサイドっぽくね?
引用: http://blog.masuidrive.jp/2015/03/03/react/
Virtual DOMはフロントサイドに富豪
的プログラミングパラダイムをもたらす
• VirtualDomによってJS内でDOMを実現できた
• つまりJSの実行環境があればサーバサイドでDOM
が作れる?
Server-Side
Rendering
• ユーザからリクエストを受けた最初のレンダリン
グのみサーバサイドで行う
• クライアントでDOMを作り始めないので体感速度
が上がる
• リクエストしたタイミングでレンダリングが終わっ
ている、ということはクローラーが認識できる
• つまりSEOに対応できる!
他言語対応もありまぁす
• reactjs/react-python
• reactjs/react-php-v8js
• reactjs/React.NET
• yanns/play-react
• reactjs/react-rails
他言語対応もありまぁす
• reactjs/react-python
• reactjs/react-php-v8js
• reactjs/React.NET
• yanns/play-react
• reactjs/react-rails おっ
React with Rails
• react-railsを使ってRailsにReactを組み込む
• Scaffoldで生成されるようなアプリを再現する
• CRUD
• ルーティング
Demo
https://rails-scaffold-react.herokuapp.com/
外部のReact Components
• Reactable
• TableをReactComponentとして実現できる
• JSオブジェクトを渡すだけでテーブルを表示
• ソート機能などもあり
• react-router
• React.jsでルーティングを実現する
React Componentsの探し方
• React Components
• http://react-components.com/
• React Rocks
• http://react.rocks/
Reactいいじゃん!
Reactサイコー!
Reactのつらみ
• コード量増える(jQuery,Angular.jsと比較)
コード量比較(当社比)
jQuery
$('#target').click(function() {
$('#output').html(function(i, val) { return val*1+1 });
});
var Counter = React.createClass({
getInitialState() {
return {
count: 0
};
},
onClick() {
this.setState({count: this.state.count + 1});
},
render() {
return (
<div>
<div>count:{this.state.count}</div>
<button onClick={this.onClick}>click!</button>
</div>
);
}
});
React.js
コード量比較(当社比)
jQuery
$('#target').click(function() {
$('#output').html(function(i, val) { return val*1+1 });
});
var Counter = React.createClass({
getInitialState() {
return {
count: 0
};
},
onClick() {
this.setState({count: this.state.count + 1});
},
render() {
return (
<div>
<div>count:{this.state.count}</div>
<button onClick={this.onClick}>click!</button>
</div>
);
}
});
React.js
_人人人人_
> 6倍 <
 ̄Y^Y^Y ̄
Facebook曰く
• コードは書く時間より読む時間の方が長いんだ!
• ReactはViewのみを管理するものなので何かし
らのアーキテクチャが必要
Flux
Fluxとは
• アーキテクチャの名前
• 言ってしまえばObserverパターン
• データフローを一方向にすることで複雑性を排
除する
引用: https://facebook.github.io/flux/docs/overview.html
引用: https://facebook.github.io/flux/docs/overview.html
• ユーザからのアクションやサーバからのレスポン
スを受ける
• 構築したデータをDispacherに渡す
• WebAPIとやりとりするのもここ
引用: https://facebook.github.io/flux/docs/overview.html
• Actionからデータと配送先が渡されるので順次
配信する(大体の場合Store)
• 実装上はEventEmitterで良い
• facebook/fluxはこの部分のみ提供する
引用: https://facebook.github.io/flux/docs/overview.html
• モデルみたいなもの
• Dispacherから渡されたデータを保持する
• Dispacherからデータが渡されたらイベントを
発行する
引用: https://facebook.github.io/flux/docs/overview.html
• Storeを監視してデータが変更されたらViewに
反映する
• React.jsが担うのはここ
• ユーザからのアクションをActionに通知する
引用: https://facebook.github.io/flux/docs/overview.html
• データフローを一方向にすることで設計をシン
プルにする
• Fluxの功績はこのパターンに名前を付けたこと
• ここで紹介したFluxはあくまで一例
• Fluxは概念なので実装によって変わる
いろんなFlux実装
• facebook/flux
• yahoo/fluxible
• martyjs/marty
• kenwheeler/mcfly
• deloreanjs/delorean
Fluxを扱ったDemo
http://peranikov.github.io/kpt-react
まとめ
• Reactは速度と設計を両立させるViewのライブ
ラリ
• 生産性を上げるためのものではないし、コード
量は増える
• React単体では扱いにくい。Fluxを併用しよう
参考文献
• ReactとFluxのこと
• https://speakerdeck.com/geta6/reacttofluxfalsekoto
• 一人React.js Advent Calendar 2014
• http://qiita.com/advent-calendar/2014/reactjs
• Introduction To React
• https://speakerdeck.com/hokaccha/introduction-to-react

Intoroduction to React.js