VueJS, Vuex, Firestoreでリアルタイムチャットを実装
最近VueJSでPWAを実装するにあたり調べていて、Lachlan Millerの良さげな記事を見つけたので紹介します。彼はVueJS coreのコミッターでVueJSに関するいろいろなな記事を書いているのでチェックしてみるといいですね。
先週GoogleのFirebaseがCloud Firestoreという新製品をリリースしました。 Cloud FirestoreはFirebaseのリアルタイムデータベースとよく似ており、リアルタイムアプリケーションを構築するためのNoSQLベースのクラウドデータベースです。Firebaseへのクエリは複雑になりがちな問題などをCloud Firestoreを使うことで解決することができます。機能についての詳細ははこちらをみてください。
この記事ではVueとVuexとCloud Firestoreを使ってFirechatという簡単なリアルタイムチャットアプリケーションを実装します。 FirestoreをVue.jsアプリケーションで使う方法やVuexのベストプラクティスを見ていきます。 Githubでこの記事のソースコードを入手できます。
注:この記事は最初、Vue.js Developersのブログ(2017/10/16)に掲載されました。
インストール
vue-cliを使って新しいVueアプリケーションを足場で始めましょう。ここではwebpack-simpletemplateを使います。
$ vue init webpack-simple firechat
この後普及した演算子… async / awaitを使います。またステート管理のためにVuexを使用し、ランダムIDを生成するためにuuidを使用しますので、それらをインストールしておきましょう。 Firebaseモジュールも必要です。
$ npm install babel-plugin-transform-async-to-generator babel-plugin-transform-object-rest-spread Firebase babel-polyfill vuex uuid --save
次にプロジェクトのルートディレクトリで、.babelrcを次のように編集します。
これでスプレッド演算子の…とawait/asyncを使う事ができるようになります。 ここから先に行く前にFirebaseに行き、アカウントを持っていない場合はサインアップしてください。作業を終えたら、[プロジェクトの追加]をクリックして名前を入力します。
そして「FirebaseをWebアプリケーションに追加」をクリックします。
config
オブジェクトを取得し、以下のようにsrc
の下にconfig.js
というファイルを作成します。 “test mode”を選択してください。これはFirestoreの学習用に使えます。これはあなたのデータベースが公開されることを意味するのでインターネット上にリンクを共有しないでください。
const config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "",
messagingSenderId: "..."
};export default config
Firebaseに戻ってデータベースタブの下にある”Try Firestore Beta”と”Start in Test Mode”をクリックすると、データベースへの更新をリアルタイムで見ることのできるUIに遷移します。
VuexにFirestoreのセットアップ
次にVuexとFirestoreのセットアップを行います。 src
フォルダの下にstore
と呼ばれるフォルダを作成し、index.jsを次のようにします:
次にmain.js
に行って、storeをインポートしてアプリ内にインポートします。
最後にApp.vue内のコンテンツを全て以下で置き換え、データベースにconsole.logを追加して、動作を確認します。
そしてnpm run dev
を叩いてサーバーを実行します。間違いがなければ、Firestore {__ob__:Observer}
がコンソールに表示されます。これでFirestoreが設定され動作しているのが確認できました。
最初のデータをFirestoreに書き込む
初期データを作成しましょう。ここではFirestore APInのadd
メソッドを使って書き込む事ができます。まず、src
にInitialize.vue
というコンポーネントを作成します。このコンポーネントは、データを書き込むためのインタフェースを提供します。データの実際の作成はVuexストアで行われます。
後でデータを取得する時に使うget()のメソッドのスタブも作りました。 このアプリケーションには、conversations.js
とusers.js
の2つのVuexモジュールがあります。メッセージはconversations.js
の配列に保存されます。アプリケーションがますます大きくなる場合はmessages.js
用のモジュールも作成しますが、この段階では不要です。
store
内にconversations.js
とusers.js
を作成してください。
ユーザーのデータの書き込み
users.js
内に次の行を追加します。
state
は単に状態を宣言するので、Vueがリアクティビティを追加することができます。 currentUser
は誰かがログインしたことをシミュレートし、メッセージのsend
プロパティを設定するために使用されます。
db.collection( ‘users’)
はFirestore APIの一部です。 Firestoreデータベースのコレクションへの参照を返します。存在しない場合作成されます(または文書を挿入するときに作成されます)。詳細はこちら:https://firebase.google.com/docs/firestore/data-model
Firestoreは新しいデータを追加するset()
メソッドを提供しています。ユニークな識別子を指定する必要があります。この場合、私は通常usernameと呼ばれるものを使用しています — mr_a, mr_b
など。ユーザーがfirstName
またはlastName
を変更したとしても、識別されたユニークは同じままです。上記のコードでは、私もcurrentUser
を状態に設定しました。これは後でメッセージを送信するときにsender
フィールドを設定するために使用されます。簡単です。
最初の会話のデータの書き込み
conversations.js
からいくつかのデータを書き込んで、もう少しFirestore APIを見てみましょう。
users
storeに比べてもうちょっといろんな事が起こってますね。all
にこのアプリの全ての会話が含まれています。
allIds
には conversation.id
の配列が入っています。最後に allMsgIds
に