■Firebaseとは
Firebaseは、2014年10月にGoogleに買収されたことで一躍有名になったBaaS(Backend as a Service)です。
BaaSは、サービスの運用に必要な汎用的なサーバー機能を提供するクラウドサービスの一形態です。提供される機能はサービスにより様々ですが、ユーザ管理・認証、データの保存などの機能を持っていることが多くあります。
Firebaseも同様に様々な機能を持っていますが、今回はその中からリアルタイムデータベース機能を活用し、簡易的なリアルタイムチャットを構築してみたいと思います。
■Firebaseに登録
以下のURLよりFirebaseにアクセスし、アカウント登録します。
https://www.firebase.com/login/
■プロジェクトを作成
以下の画面にて「新規プロジェクトを作成」を押してプロジェクトを作成する。
■コードスニペットを取得
「ウェブアプリにFirebaseを追加」を押して、コードスニペットを取得する。
■パーミッションを設定
左側のメニューのDatabaseを選択し、パーミッションを設定する。
以下になるようにルールを書き換える。
1 2 3 4 5 6 |
{ "rules": { ".read": "true", ".write": "true" } } |
■HTMLの用意
・Firebaseを初期化する。
1 2 3 4 5 6 7 8 9 10 11 |
<script src="https://www.gstatic.com/firebasejs/3.1.0/firebase.js"> <script> // Initialize Firebase var config = { apiKey: "<!-- API KEY -->", authDomain: "<!-- -->.firebaseapp.com", databaseURL: "https://<!-- -->.firebaseio.com", storageBucket: "<!-- -->.appspot.com", }; firebase.initializeApp(config); </script> |
・データを保存するときは次のように書きます。
1 2 3 4 5 |
database.ref().child('posts').push({ name: $('#name').val(), message: $('#message').val(), created: formatDate(now, 'YYYY/MM/DD hh:mm') }); |
・データを取得するときは次のように書きます。
1 2 3 |
database.ref('posts').on('child_added', function(data) { // 受信したときの処理を書く }); |
■まとめ
今まではリアルタイムチャットを作ろうとすると、自前でサーバを用意しSocket.IOなどを使って、少し時間をかけて実現していましたが、Firebaseを使うとこれほど簡単に構築することができました。
特に、限られるリソースで制作を進めるスタートアップでは積極的に導入を検討してみると良いと思います。
以下に今回作成した全コードのリストは以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<html> <head> <title>チャットサンプル</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> <script src="https://www.gstatic.com/firebasejs/3.1.0/firebase.js"></script> <script> // Initialize Firebase var config = { apiKey: "", authDomain: "", databaseURL: "", storageBucket: "", }; firebase.initializeApp(config); var database = firebase.database(); $(function() { $('#postButton').on('click', function(event) { var now = new Date(); database.ref().child('posts').push({ name: $('#name').val(), message: $('#message').val(), created: formatDate(now, 'YYYY/MM/DD hh:mm') }); }); }); database.ref('posts').on('child_added', function(data) { var value = data.val(); var element = $("<li class='list-group-item'><b>" + value.name + "</b><br />" + value.message + "<br />" + value.created + "</li>"); var messages = $('#messages'); messages.append(element); }); var formatDate = function (date, format) { if (!format) format = 'YYYY-MM-DD hh:mm:ss.SSS'; format = format.replace(/YYYY/g, date.getFullYear()); format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2)); format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2)); format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2)); format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2)); format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2)); if (format.match(/S/g)) { var milliSeconds = ('00' + date.getMilliseconds()).slice(-3); var length = format.match(/S/g).length; for (var i = 0; i < length; i++) format = format.replace(/S/, milliSeconds.substring(i, i + 1)); } return format; }; </script> </head> <body> <div class="panel-default"> <div id="scroller" class="panel-body"> <ul id='messages' class="list-group"> </ul> </div> <div class="panel-footer"> <input id="name" type='text' class="form-control" placeholder="ユーザー名を入力してください"> <textarea id="message" class="form-control" rows="5" placeholder="メッセージを入力してください"></textarea> <input id="postButton" class="btn btn-primary" type="button" value="Input"> </div> </div> </body> </html> |