React / Flux を実案件で使ってみた (2015/02/16 講演資料)

## 2015/02/16 [歌舞伎座.tech#6「VirtualDOMとReact」 ](http://kbkz.connpass.com/event/11254/)

---

## 自己紹介

* Name : **Takuto Wada**
* github : [twada](https://github.com/twada)
* twitter : [t_wada](https://twitter.com/t_wada)
* hatena : [t-wada](http://t-wada.hatenablog.jp/)
* TDD とライオンの人
* [power-assert](https://github.com/power-assert-js/power-assert) の人

[![power-assert](https://raw.githubusercontent.com/power-assert-js/power-assert-js-logo/master/banner/banner-official-fullcolor.png)](https://github.com/power-assert-js/power-assert)

---

## React / Flux を知ったきっかけ

* mizchi さんのエントリ ([あなたがReactを使うべき理由](http://mizchi.hatenablog.com/entry/2014/09/02/201728)) だったと思う
* 日本語の情報はほとんど無かったが、エッジ系の人たちが騒ぎ出した & 海外で圧倒的に事例が増え出したので興味を持った
* [Rendr](https://github.com/rendrjs/rendr) をつくった AirBnb が React を使い始めたことを知り、これは決定的だと思った

---

### React をどう勉強したか

* 公式ドキュメントとチュートリアルが充実している
* まず [Tutorial](http://facebook.github.io/react/docs/tutorial.html) をそのまま写経
* 次に [browserify](http://browserify.org/) + [babelify](https://github.com/babel/babelify) で Tutorial をもう一周やってみる (showdown は [browserify 対応していない](https://github.com/showdownjs/showdown/issues/50)ので [marked](https://github.com/chjj/marked) に変更。 jQuery も Fetch API Polyfill に入れ替えてみる)
* [Thinking in React](http://facebook.github.io/react/docs/thinking-in-react.html) で思想を学ぶ
* koba04 さんの [Get Started React.js](https://speakerdeck.com/koba04/get-started-react-dot-js) でとどめを刺す
* [気になった情報はブクマしておく](http://b.hatena.ne.jp/t-wada/react/)

---

### 今なら React をどう勉強するか

* いまから学ぶなら koba04 さんの [一人React.js Advent Calendar 2014](http://qiita.com/advent-calendar/2014/reactjs) がまず最初にオススメ
* [Flux react現状確認会](http://www.slideshare.net/VOYAGE_GROUP/flux-react) の資料も良い
* mozaic.fm の mizchi 回 [#13 Virtual DOM](http://mozaic.fm/post/106264251221/13-virtual-dom), [#13 Virtual DOM sideshow](http://mozaic.fm/post/106622047573/13-virtual-dom-sideshow) を聴く

- (追記) [今話題のReact.jsはどのようなWebアプリケーションに適しているか？ Introduction To React](https://html5experts.jp/hokaccha/13301/)

---

## Flux をどう勉強したか

* 概念から理解しようと思うと混乱するので、まずは手を動かす。[Tutorial](http://facebook.github.io/flux/docs/todo-list.html) を写経
* 一通り終わったら、次に  [Overview](http://facebook.github.io/flux/docs/overview.html) を読む
* saneyuki_s さんのエントリを読む ([Fluxアーキテクチャの覚え書きを書いた](http://saneyukis.hatenablog.com/entry/2014/09/26/174750) と [Fluxとはなんだったのか + misc at 2014](http://saneyukis.hatenablog.com/entry/2014/12/24/014421))
* 最後に [Chat Tutorial](http://facebook.github.io/flux/docs/chat.html) の資料で複数 Store の設計を学ぶ
* さらに Isomorphic App の設計と実装を学びたいなら [yahoo/flux-examples](https://github.com/yahoo/flux-examples) を読む

- (追記) [ReactとFluxのこと](https://speakerdeck.com/geta6/reacttofluxfalsekoto)

---

## 実案件で適用したところ

* 業務システムのやや複雑な管理画面 (新規開発する画面)
* 他の画面は jQuery で書かれているが、新しい画面は複雑なので jQuery のままでは破綻することが予想できた
* その画面でだけ React を使うことにして、 React / Flux でトップダウンに設計 & 実装
* 設計の方法は [Thinking in React](http://facebook.github.io/react/docs/thinking-in-react.html) と Flux の二つのチュートリアルを踏襲

---

## 開発環境

* Emacs + [web-mode.el](http://web-mode.org/) (jsx のサポートがある)
* ライブラリは React.js + [元祖 Flux](https://github.com/facebook/flux) (facebook の Flux 実装)
* ビルドは npm run で統一。 `npm run build` で [browserify](http://browserify.org/) を叩いてビルド
* `npm run watch` でコードが更新されたら [watchify](https://github.com/substack/watchify) で検知して再ビルド
* browserify / [webpack](https://github.com/webpack/webpack) との親和性が高い。多くの npm モジュールが使えるので他にも単機能の小さいライブラリを積極的に使う

---

## チームにどう伝えたか

* チーム向けに導入ガイドを書いて啓蒙
* [nodebrew](https://github.com/hokaccha/nodebrew) 入れて npm install して npm run build の3ステップで使えるところまで手数を減らす
* React / Flux の概念は日本語情報を中心に簡単なリンク集を作成
* あとは画面の構造に即して画面の各コンポーネントのコードを読んでもらう
* 画面がコンポーネントに構造化されて整理され、 JSX の見た目も実際の HTML タグ構造に近いので、チームメンバーにも意外と評価が高かった

---

## 実際に使ってみてどうだったか (1)

* 富豪的にデータを更新してもレンダリングコストの心配をしなくて良いのは想像以上のメリット
* サーバサイドでテンプレートを毎回レンダリングするのと同じ感覚でクライアントのコードも書ける
* データ更新の方向が一方通行なので状態が一意に定まり、混乱しにくい (Single source of truth)
* トップダウンに画面を構造化して設計できるのも良い。自然に部品化されるので共通化が行いやすい

---

### 実際に使ってみてどうだったか (2)

* Virtual DOM は足回りなのでほとんど意識しない。実際に使ってみると、現実的な React の強みはコンポーネント化であり、 Flux によるアーキテクチャの単純化だった
* ["Reactの発明は成立由来からしても、UIのコンポーネント化・テンプレート化をカジュアルに行える点であり、Virtual DOMは彼らにとっては速度面のトレードオフを抑え込むためのトリックにすぎない"](http://saneyukis.hatenablog.com/entry/2014/12/24/014421) by saneyuki_s

---

### はまったところなど

* 最初 state と prop の使い分けが分からなかった (後に外部インターフェイスとして機能し、親からデータを与えられるものが prop, 自分で所有しているデータや状態が state と使い分けている)
* HTML と JSX で微妙に属性名が違うところもチームメンバーは少し混乱する
* アニメーションが良くわからない
* バリデーションの設計も悩んだところ
* jQuery-UI の置き換え問題!!!

---

### まとめ

* あらためて何が React / Flux の美点か
* ["Virtual DOMによって「パフォーマンス面で問題を出さずに」常にゼロから状態を構築する、ということが可能になった"](http://qiita.com/mizchi/items/4d25bc26def1719d52e6) by mizchi
* ["Topレベルの要素にアプリケーションの状態を持たせておいてそれをsetStateでどんどん更新するという雑なアーキテクチャも可能。DOM周りの面倒でパフォーマンスに影響を与える部分をReact.jsに任せることでアプリケーションの実装を単純に出来る"](http://qiita.com/koba04/items/fd6d9f24f9f6ce50e47e) by koba04

---

### Special Thanks to

* mizchi さん
* koba04 さん
* saneyuki_s さん
* この3人がいなければ React / Flux を使っていなかったと思う。ただただ感謝。