歌舞伎座.tech#6「VirtualDOMとReact」 アウトラインメモ
歌舞伎座.tech#6「VirtualDOMとReact」 - connpass に参加して来たのでメモ。
すべてのCSSに死を!これはJSerの叫び!- @kyo_ago
スライド: CSSに死を!これはJSerの叫び! #kbkz_tech
- CSSが辛い
- CSSはカプセル化とか継承とか、プログラムからの概念がそのまま持ってこれない
- ReactStyle
- js-next/react-style
- JS内にStyleを埋め込むことができる
- そのままオブジェクト的に入れられる
- Template Stringsと合わせればその場でCSSを入れることができる
styles=
にスタイルを入れる
- セレクタをあまり考えなくていい
style
属性でスタイリングする- 擬似要素、擬似クラスが全滅
:hover
:active
- などが使えない。
- CSSの継承などの概念が消える
- 自分で頑張る必要がある
ユーザプレビュー用LocalProxy - @kyo_ago
- 非エンジニアのユーザーに対するプレビュー
- このブランチでDockerとか大変
- ステージング環境を用意するのが大変
- アクセス制限やデータ用途が面倒
- 同時並行で確認できる環境とか作るの大変
- => ローカルプロキシでURLを別のURLにリダイレクトするプロキシ
- Chrome拡張で実装したローカルプロキシ
- 手元のJSやCSSをビルドしたものをどこかにアップロード(Google Driverで管理)、そのリソースのURLをアップロードにしたものへと置き換える。
- 置き換え設定を吐いて、プロキシに読み込ませる
Dive into React.js - @koba04
- Viewのライブラリ
- Componentを組み合わせてUIを作る
- 1wayなデータバインディング
- React Developer Tools - Chrome ウェブストアを使うとReactの
props
とかComponent見られる - VirtualDOMからCanvasを吐いたり、単純なHTML以外でもある
- Component?とElement?
React.createClass
が作るのが ComponentReact.createElement
でできるのが Element - Virtual DOMの各要素を表す小さなオブジェクト
- Props
- Propは外部のインターフェースとなる
- Componentに何を渡したらいいのかの仕様的な感じ
- デバッグ時はインターフェースに合わないものを渡すと警告
- プロダクトだと無害
- State
- StateはComponentの状態
setState
は非同期に更新される- Fluxでループを回してアクセスされることをが前提にあるからかな?
- Reuseable
- Componentの役割を意識する
- VirtualDOMはインフラ
- 書くときに気にする部分はあんまりきにしない
- keyをつけるぐらい
- Componentのライフサイクル
- 基本的にはこの部分に処理を書いてComponentを書いていく
- JSX
React.createElement
のシンタックスシュガー- テンプレートらいくなやつ : wix/react-templates
- react-tools
- jsxコマンドや変換ライブラリが入ってる
- Babel(6to5)
- 元からJSXサポート
- ref、getDOMNode
- refはgetDOMNodeと組み合わせて使う
- dangerouslySetInnerHTML
- HTMLを直接吐く危険なAPI
- SyntheticEvent
- Componentのイベントdelegate
- How to test
- React.addons。TestUtilsなどを使ってテストする
- 基本的にはDOMに追加してテストする
- rackt/react-router
- ルーター
<Route>
isomorphic的なときにも動く
- サーバサイドレンダリング
- React.jsではComponentの状態をオブジェクトを持ってるので、HTMLとして吐き出すことができる
- SEOや初期ロードの時などに活用
- 実装方法
renderToString
- フロントでもReactを使って動かす
- reactIdなどの属性がついたHTMLができる
- クライアントサイドでReactで処理を続ける
- Flux
- Facebook/Flux はdispatcherのみ
- Fluxライブラリが乱立してる
- voronianski/flux-comparison
- Flux solutions compared by example - Pixelhunter.me | Dmitri Voronianski's blog
- React.jsは簡単か
- 基本的にJavaScriptの知識をそのまま使える
- Reactは開発速度よりもアプリの信頼性を高めることが目的
- FAQ
- どこから始めるか?
- 「VirtualDOMはブラウザが取り込んでいくべきなのかどうか?」
- 「React.js Advent Calenderで書き残したこと?」
「React/Fluxを実案件で使ってみた」その後 - @t_wada
- React / Flux を実案件で使ってみた の続編
- RendrのAirBnbがReactを使い始めたのがきっかけの一つ
- Reactをどう勉強したか
- 公式ドキュメント、チュートリアルが充実してる
- そのまま写経していって覚えた
- Flux
- flux/examples/flux-chat at master · facebook/flux
- チャットのサンプルがよくできてる
- Storeが普通のサンプルだと1つだけど、chatチュートリアルだと複数あって実践的
- 実案件で適応したところ
- 業務システムのやや複雑な管理画面で使った
- Angularが強い場所
- Excelみたいな複雑で更新頻度が高いやつ
- Reactが向いてるのでは? となり使った
- 開発環境
- Emacs
- React + 元祖Flux
- Browserify
- npm runでビルド
- Browserifyみたいなのを使うとモジュールの選び方が変わる
- underscore.jsみたいな全部入りより、細かいライブラリを合わせて使うようになる。
- チームにどう伝えたか
- 最初に画面の各コンポーネントの対応表みたいなものを作った
- 画面がコンポーネントが構造化されて整理できる
- 実際に使ってみてどうだったか
- 富豪的にデータを更新してもレンダリングのコストを心配しなくていい
- データを渡して全部レンダリングし直すみたいのがVirtualDOMで吸収できて楽ができる
- はまったところ
- stateとpropの使い分け
- 親から渡ってくるものがprop
- Componentの内部的な状態がstate
- jQuery UIの置き換え
- stateとpropの使い分け
- テストについて
- 公式はJest(jasmineベース)
- Node.js 0.12/io.js で動かない
- Jasmine 2とかに対応してない?
- デフォルトモック, モッキスト
- 遅い
- 普通にMocha+assertでも書ける
- TestUtilsがやってくれる
- プロパティに触るだけで死ぬパターンがある
- 観測によってテストが失敗する
- テスト・ツールがやっちゃいけないこと
- React/Flux何が良かった
- サーバサイドみたいなやり方
- パフォーマンスの問題が起こさずに、データとテンプレートをあわせるだけでできる
- プログラミングモデルがすごい単純にできる
- FAQ
- どれぐらいの規模感
- でかいフォーム | 右プレビュー
- 3日ぐらい
- どれくらいのComponentの分割
- 細かく分けてもVirtual DOMでコストはまかなえる
- 細かく分けたほうがテストは書きやすい
<div>
の入れ子が大体一つのComponentになる感じ
- Componentの値のやり取り
- 親子がある場合は親から子へpropを渡す
- 子のonChangeは親に伝えることができる
- 再描画したいComponentまでonChangeが渡ったらActionを叩く
- Storeと同じぐらいの大きさのComponent
- そのComponentは自分が何をするか知ってる
- 子のComponentは渡ってきた値を表示するだけ
- どれぐらいの規模感
Real World Virtual DOM - あるいは次世代アプリケーション設計 - @mizchi
- Reactが話題になれば、プロダクションで使えます。
- Kobito
- atom-shell版を作った話
- Qiita(Qiita Team)
- 同期しないでローカルでも使える
- 結局Reactとはなんだったのか
- 単なる「データバインド付きテンプレートエンジン」
- VirtualDOMとしてのReactの選定理由
- 情報が十分ある
- でもちょっとでかい
- Qiitaへのフィードバック
- Atom-Shellで作ってるけど
- 作ったComponentをウェブへ持っていけるかも
- Atom-Shellで作れるメリット
- Nodeのモジュールを呼べる
- Same Originを超えられる
- デスクトップアプリとして配布できる
- ブラウザストレージの上限を設定できる
- 設計時に問題になったこと
- 問題: JSX
- JavaScriptの知識を要求しすぎる
- listを
array.map
で作る
- listを
- AltJSと相性がよくない
- テンプレート密結合しすぎる
- ViewModel的な
- JavaScriptの知識を要求しすぎる
- 解決: JSX
- React-Jade
- JadeテンプレートをReactの関数に落とす
- jade と slim 似てる
- 開発言語
- UIはReactでCoffeeScript
- ドメイン層はTypeScriptで書かれてる
- Flux実装の現実
- 薄い
- どの実装もそれな感じ
- 作った: mizchi/arda
- Store/View/Dispatcherの塊をContextという単位で管理
- ReactのState/Propの概念を継承した
- 位置づけ、Fluxよりもう少し上の概念でMeta-Fluxといってる
- モジュールを単純に
- Viewは単なるReactComponent
- Dispatcherは単なるEventEmitter
- StoreはEventを受けて状態を更新
- ContextをTypeScriptで記述できるようにする
- 型によって仕様を明確にするのが目的
- ComponentPropsが存在する意味は
- Componentが知るべき状態を分離したかった
- Chaplinjs的な分離
- ComponentPropsが同じなら必ず同じViewを吐く
- Kobito と Arda
- ContextはTypeScriptで型で保護する
- ComponentはCoffeeScriptで雑に書いてEventをdispatcherする
- Eventの購読側はTypeScripdで書く
- Isomorphicの実践
- 同じライブラリがNodeでもブラウザでも動くといい
- UnitTestはNodeでやりたい
- 起動コストが高くて不安定なヘッドレスではやりたくない
- isomorphicのための抽象化
- ストレージ
- DOM
- JSDOM
- ReactのIsomorphic化
- ブラウザ環境がなくても動く
- JSDOMを使っても動く
- componentWillMountまでは呼ばれる(DOM履く直前)
document
,window
,navigator
があればReactが動かせる(JSDOMでモックする)
- Atom-Shellの配布
- 配布用にビルドしたjsだけにした
- node_modulesなどには色々はいっててproductにはいらない
- 実際のReact
- 画面を変化させまくるときには良い
- Reactの懸念点
- サイズがでかい
- 他のVirtual DOM実装がいったいどれが残るかわからない
- jQueryとReact
- 思想レベルで衝突してる
- jQueryをリードオンリーモードとして使えばいい
- DOM
- CodeMirrorみたいなDOMの塊は一つコンテナを用意して入れておく
- jQueryを使った箇所
- スクロール量の読み出しと更新
- 擬似クリックイベントの白化
- aタグの挙動を全部埋めるハック
- 大規模SPAの設計
- ストレージを扱うとデータ管理がシビア
- ドメイン駆動を意識する
- RP(Reactive Programming)
- ストレージを扱うとデータ管理がシビア
- いいところ
- Reactは設計が単純化に方向に働く
- クライアントサイドはisomorphicになっていく
Reactと関数型AltJS
- Om
- Elm
- blaze-html
- ReactやVirtual-DOMラッパを持つAltJSが増えた
- jQueryはやんちゃだった
- AltJSは自己主張が激しい、ReactはViewのみだったので共存できた
- Reactを関数型AltJSで書く利点
- Om、elm-htmlは
- immutableでComponentの更新状態がはっきりする
- オススメのAltJS
- ClojureScript
- Om
- Elm
- FRPで有名なElm
- Scala.js
- 安定
React + Cordovaでスマホアプリを作る - MASUI
- チュートリアルはごまかしがきくので何か作って見る
- 現実に近いところで
- トレタのみにツールを作って見た話
- APIを叩いて表示
- Cordovaを使ってアプリ化する
- CSSの問題
- http://react-bootstrap.github.io/
- http://goratchet.com/
- UI Componentは結局自作
- コンポーネント構造
- 全体でも300行ぐらい
Flowtype - @teppeis
スライド: Flowtype Introduction
- Facebookが発表したJavaScriptの型チェックツール
- コンパイル時に静的に方の整合性をチェックすることができる
- TypeScriptっぽい型注釈
- 強力な型推論
- TypeScriptより厳しいチェックする
- Reactのサポート
- PropTypesの定義を型をコンパイルチェック
- ES6 Class with React
- Flowtypeのコンパイルが早い
- flowコマンドでバックグランドにプロセス立ち上げて
- 次から高速
- Flow vs TypeScript
- 高速なインクリメンタルコンパイラ
- Flowはlangじゃない
- Flowtypeは型チェックだけというレイヤー
- 型注釈を削ったらそのままJSになる
- TC39に型注釈の仕様に提案してる
- はまりポイント
- 情報がなくて、まだ不安定
Riot.js - @neo6120
- 独自シンタックスがいいわけじゃなくて
- それっぽいコンポーネントを書いたら動くのがいい
- 最近、ランタイムがバグってる
- Vue.jsが何か意外とよさそうなのでは
- Riot
- Vue
- React
- でそれぞれ作って比較した
- emo
- 求めてたものはvue-componentだったのでは
Fluxの話 - @banana_umai
- DispatcherとActionのモヤモヤについて
- Flux solutions compared by example - Pixelhunter.me | Dmitri Voronianski's blog
-
Dispatcher and Constants あたりの話
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。