今回の目的
実践的なBaaSの利用法を学ぼう!
やること
React.jsとmilkcocoa.jsでTwitterライクなリプライ通知機能を実装してみます。
準備するもの
- reactmilk-tutorialをローカルに持ってきてください。
- (4月30日以前に記事を読んだ方)Firebaseのアカウントを作って、appを1つ作成してください(MilkcocoaがMQTT対応でメンテナンス中のため)。
- (5月1日以降に記事を読んだ方)Milkcocoaのアカウントを作って、appを1つ作成してください。
コードを読むだけで理解できる方は以下を読み進める必要はありませんが、順を追ってReactの使い方とBaaSの使い方の解説を入れて行きます。
手順
Reactの動作確認
gulpの準備
npm i gulp gulp-webserver
してください。
Reactの動作環境を作る
react本体とjsxコンパイラはcdnでホスティングされているので、練習にはそれを使いましょう。.jsx
ファイルを読み込んで、typeとしてtext/jsx;harmony=true
を付けましょう。これで実行時にES6とJSXを利用可能な状態として実行時に処理してくれます。
Milkcocoaの動作確認
Milkcocoaはちょうどメンテナンス期間で5月1日まで新規アプリケーションの作成を停止しているので、今日のところは筆者が作ったOSSのMilkcocoa互換インターフェースを使いましょう。
PubNubとFirebaseを無理矢理ひっつけて作ったので、ところどころ動作が不安定かもしれません。
すぐに本家Milkcocoaは復活するので、load-milkcocoa.js
の記述を書き換えてあげましょう。
フィードのビューの実装
tweetが表示されるフィードについて、実装を省いた振る舞いだけを書くと以下のような感じになります。
基本的に描画・イベントリスナがほとんどを占めています。
FEEDクラスをwindowオブジェクトに逃がしてあげて、main.jsxで呼び出す形の実装になっています。
ログイン如何に合わせてランディングページを表示するか、フィードを表示するかの切り分けは以下のようにすると良いでしょう。
今回は、フィードコンポーネントにデータストアから取得した値を渡してレンダリングする設計になっています(React上でMilkcocoaを使う際のもっと良い設計があれば随時報告します)。
React.render関数によって組み立てられたコンポーネントがMount(DOMに繋ぎ込まれる)のですが、第三引数のcallback関数はDOMが読み込まれたあとの処理と同義になります。今回はjsxファイルをHTMLに読み込む際にharmonyオプションを使用しているので、thisのスコープがES6のようになっているのでより素直に使用できます。
ログイン後画面の根幹になるFEEDクラスのrender関数は以下のような実装になっています。
- 通知数の表示ボックス
- display:noneされているリプライ一覧
- tweet一覧
- ログアウトボタン
が描画されています。
一覧表示をする際に配列をmapしているあたりが少しややこしいかもしれませんね。
通知ビューの実装
NOTIFICATIONコンポーネントは非常にシンプルです。
役割は
だけです。
同期の実装
通知監視だけBaaS特有の部分であり、React.jsとの絡みの独特さがあるので、実装を解説しましょう。
要点だけ見ましょう。
はい、とてもシンプルですね。tweetと同時に通知データストアに通知がsetされますので、それを検知したらリアルタイムに通知を増加させます。同様に、通知をクリックしたら既読ということで通知データストアから通知を削除しますので、そのデータストアイベントを監視して要素を削除している訳です。
同様に、通知に関わる実装がもう一箇所あるので見てみましょう。
こちらも、通知ボックスの通知残数の変更を監視するものですね。とてもシンプルなのでもはや説明も不要なくらいです。
ツイートフィルタの実装
tweetの中に自分の名前があったら通知するということで、フィルタ関数を実装したら終わりです(ちょっと雑なのでTwitterほど良い感じに@を取得するわけではありませんが)。
データストアの設計
今回のデータストアの設計を解説すると、
- tweetデータストア
- notification/<user_id>データストア
の2つになります。
tweetデータストアは全体のツイートが集まるものになります。notification/<user_id>データストアは、ログインしているユーザが自分のデータストアを監視して、通知を受け取るためにあります。
このように、データストアを巨大な連想配列のように自由に使い捨てるスタイルで設計するので、RDBと違って初めは戸惑うかもしれませんが、柔軟で高速な開発が実現できて大変良いです。
全体の動作確認
以上のソースコードをgulpでローカルサーバに置いてlocalhost:8000
にアクセスすると以下のような感じになります。
是非一度アクセスして、自分の名前にリプライを飛ばしてみてください。なかなか今までのWebアプリケーションフレームワークで苦労していたことを、BaaSでちょちょいと実装できていて壮快ですよ。
まとめ
BaaSを用いるとerb、Jade、PHPのようなテンプレートエンジン的なものを用いないうえに、HTTPリクエストのルーティングの必要がなくなってしまうために、全体の傾向としてSPA(Single Page Application)として実装するケースが多くなると思います。そんな中で今回の実装がひとつの指針になれば良いなと思います。
もちろん、意図的にページを分割し、1ページの中の動きある部分を最小限に保つことは可能です。その場合、既存のフレームワークと組み合わせてBaaSの同期機能などを部分的に利用する使い方もありますし、jQueryだけでプロトタイピング的に実装を完結させることもできます。様々な使い方を発想できるので、いろいろと試してみるのをお勧めします。