Vue.jsのおすすめチュートリアルのチャットアプリ作成をやってみる(更新停止)

# 更新停止について
Pusherからのチャット用APIの提供が終了したため、更新停止いたします。。。




Vue.jsを始めたいと思っていたので、下記サイトに書いてあるおすすめのチュートリアルをやりましたので、その時のメモです。
[2020年のフロントエンドマスターになりたければこの9プロジェクトを作れ](https://qiita.com/rana_kualu/items/915345b8f3f870cfe2aa)


# はじめに
下記サイトにチュートリアルがあります。
[Build a Real-time Chat App with Pusher and Vue.js](https://www.sitepoint.com/pusher-vue-real-time-chat-app/)

チュートリアルに出てくるコマンドはLinuxのものなので、私がWindowsコマンドでやった場合の記載もしていきます。

## 作成するチャットアプリについて
SlackやDiscordのような初歩的なチャットの作成

* 複数のチャンネルやルーム
* ルームメンバーとステータスのリスト表示
* ほかのユーザのタイピングを表示します


## 学べる事
(編集中)

 * Vue.jsの基礎
 * vue-cliの使い方
 * Vuexの基礎
 * CSS フレームワークの使い方
 * Pusher(CHATKIT)の使い方
 * babel

### Vuexとは
[公式サイト](https://vuex.vuejs.org/ja/)より引用
> Vuex は Vue.js アプリケーションのための 状態管理パターン + ライブラリです。 これは予測可能な方法によってのみ状態の変異を行うというルールを保証し、アプリケーション内の全てのコンポーネントのための集中型のストアとして機能します。 また Vue 公式の開発ツール拡張と連携し、設定なしでタイムトラベルデバッグやステートのスナップショットのエクスポートやインポートのような高度な機能を提供します

### Pusherとは
下記記事で概要をつかみました
[Pusherを触ってみる](https://qiita.com/alingogo/items/a52dfccc2e4711c5f521)


# チャットアプリの作成
## 事前準備
### Vue Cliのインストール
node.jsをインストールし、npmでVue CLIをグローバルインストールする。


``` 
npm install -g @vue/cli
```

### PUSHERのCHATKITの用意
[PUSHER](https://dash.pusher.com/)
公式サイトでチュートリアルに記載の通り、ユーザアカウントの作成。
無料プランの場合、1000人までユーザが作成できるみたいです。Vue.jsのチュートリアルには十分ですね。

### vue cli(vue create)でプロジェクトの作成

```
vue create pjName
```
プロジェクト作成をチュートリアルに沿って選択していきます。
何をしているかは下記ページでざっと把握しました。
[Vue-CLI 4を使用したJavaScript開発環境構築(プロトタイプ版とプロジェクト版)](https://qiita.com/cube_3110/items/9b846ce027171d304066)

*  Please pick a preset: 
プロジェクトの作成方法を選択します。
Manually select features を選択して、設定を選択していきます。

*  Check the features needed for your project: 
プロジェクトへ導入するライブラリを選択します。
今回は「Babel」「Router」「Vuex」「Linter」

*  Use history mode for router? 
Vue RouterのHistoryモードを利用するかを設定します。
今回は利用する設定(Yes)をします。

* Pick a linter / formatter config: 
ESLintのプリセットを選択します。
[Build a Real-time Chat App with Pusher and Vue.js](https://www.sitepoint.com/pusher-vue-real-time-chat-app/)では、Basicとなっていますが、存在しないので「Standard」を選択しました。

* Pick additional lint features: 
ESLintの実行タイミングを選択します。
保存時に実行する設定(Lint on Save)を選択

*  Where do you prefer placing config for Babel, ESLint, etc.? 
ライブラリ(BabelやESLint)の設定ファイルの配置個所を選択します。
今回は「In dedicated config files(専用の設定ファイル内)」を選択。

* Save this as a preset for future projects? 
次回以降のcreate projectで利用できるプリセットに登録するか設定します。
今回は設定しません。

```
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, Router, Vuex, Linter
? Use history mode for router? (Requires proper server setup for index fallback in p
roduction) Yes
? Pick a linter / formatter config: Standard
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to
 invert selection)Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config fi
les
? Save this as a preset for future projects? (y/N) n
```

上記設定を完了させ、下記画面が出れば作成完了です。

```
Successfully created project vue-chatkit.
Get started with the following commands:

 $ cd vue-chatkit
 $ npm run serve
```

この状態で、プロジェクトを作成したフォルダへ移動し下記コマンドを実行すると、
ローカル内にサーバが起動されます。

```
npm run serve
```
localhost:8080でブラウザからアクセスすると、サンプルページが表示されます。

![vue.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137239/169719c9-43da-2fbc-4da9-c12c42daacb3.jpeg)

作成されているソース類をVSCodeで見るときにvueのファイルを開いて文字がすべて白になっている場合は、
VSCodeの拡張機能の「Vetur」をインストールすると構文ごとに色付けされます。


### ソースの構成構築と必要なライブラリのダウロード

* チュートリアル通りフォルダとファイルを作成します。  
※チュートリアルはLinuxのコマンドですが、Windowsでは下記コマンドで空のファイルを作成や、ファイルの削除を行います。

```
copy nul src\assets\css\loading.css
del src\components\HelloWorld.vue
``` 

#### npmで取得できないデータのDownload

* loading.cssとloading-btn.cssはnpmリポジトリに含められないので、下記サイトからダウンロードが必要と書いてありました。  
ちなみにloading-btn.cssは「ldbtn.css」に名前が変わっているっぽいです。  
[Loading.css](https://loading.io/animation/)
[Loading Buttons](https://loading.io/button/)
MIT Licenseなので、github内のLICENSEファイルの全文をサイトに乗せることで使えます。  
[MITライセンスってなにそれおいしいの？って感じなのでメモ((φ(･д･｡)](https://qiita.com/yyama2/items/20bdf5e914c20025498a)

#### npmでチャット作成に必要なライブラリ

* [@ Puhser/cahtkit-client](https://pusher.com/docs/chatkit/reference/javascript)　：　chatkit用
* [bootstrap-vue](https://bootstrap-vue.js.org/)  ：　CSSフレームワーク
* [moment](https://momentjs.com/)  ：　日時のフォーマットユーティリティ
* [vue-chat-scroll](https://www.npmjs.com/package/vue-chat-scroll)  ：　新しいコンテンツが追加されたタイミングで自動でスクロール
* [vuex-persist](https://www.npmjs.com/package/vuex-persist)  ：　Vuexをブラウザのローカルストレージに保存する

``` 
npm i @pusher/chatkit-client bootstrap-vue moment vue-chat-scroll vuex-persist
```

### Vue.jsプロジェクトの設定
 * src/main.jsの修正
 * src/router/index.jsの修正
 * src/store/index.jsの修正  
 vuex-persistパッケージを導入することで、Vuexの状態をリロードやページ遷移の中でも保持します

### UIの作成
* src/App.vueへtemplateの実装
* store/index.jsへstateとgetの実装　・・・ VueXのステータスによるイベントリスナーの定義？
    * stateのloadingの設定はCSSのloaderを起動する条件として利用するために設定
    * gettersのhasErrorの設定はエラーが起きた瞬間にエラー状態を利用するために設定

## ログイン画面の確認
ここで一度実行をするとログイン画面ができている

```
npm run serve
```

## チャットの画面の作成
ログイン画面までできたので、チャットの画面を作成します。

* ChatDashboard.vue チャットの画面を管理するレイアウト用
* ChatNavBar チャットのナビゲーションバーの提供
* RoomList ユーザが入れる部屋一覧と部屋選択機能
* UserList 選択している部屋のメンバー一覧
* MessageList 選択している部屋に投稿されている発言一覧
* MessageForm 選択している部屋へ発言するためのフォーム

ブラウザで下記URLへ直接アクセスすると画面構成を確認できます
> http://localhost:8080/chat