Vue.jsでちょっとSPAなWebアプリ作ってみたときのメモ

# はじめに

SPAなWebアプリを作ってみたくなりVue.jsを勉強しながらやってみたので，その時のメモです．
基礎的なところまでは全体に結構簡単に進めることができて楽しかったのですが，それでもまぁ一から調べながらだったのでそれなりには時間がかかったのと，普段それほど頻繁にWebアプリのコードは書かないので，忘れてしまうともったいないと思って書き残します．

# 開発環境

今回の自分の開発環境は次のようになっています．OSはWindowsを使いましたがNode.js（npm）が使えれば何でもとくには関係ないと思います．

* Windows 10 Pro
* Node.js v10.15.0
* npm 6.4.1

# Vue CLIのインストール

今回の開発はVue CLIを使って行いました．適当にググってみるとVue CLIの2と3の情報があり使い方も違っているので注意です．今回はVue CLI 3を使っています．
npmを使ってグローバルにVue CLI 3をインストールします．

```console
$ npm install -g @vue/cli
$ vue --version
3.4.0
```

# プロジェクトの作成

インストールしたVue CLIを使ってプロジェクトを作成します．対話形式にいろいろと聞かれるので，作成するWebアプリの内容にあわせて選択してください．
今回は`Router`と`Vuex`を使いたかったので，`Manually select features`からそれぞれ必要な項目を選択してセットアップしています．またlinter / formatterの項目ではなんとなく`ESLint + Standard config`を選びました．

```console
$ vue create app-name
```

プロジェクトの作成が終わったら，表示されている内容に従って次のようにコマンドを実行して[http://localhost:8080/](http://localhost:8080/)にアクセスすると次のようなWelcomeページが表示されます．

```console
$ cd app-name
$ npm run serve
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/45310/80457fe3-2fda-97e6-960a-3d04deddb6a9.png)

また，この状態で`serve`の他にも次のようなnpm-scriptsが登録されています．入門したての慣れない環境での開発でもlintがすぐ使っていけるのは助かりました．

```json:package.json
"scripts": {
  "serve": "vue-cli-service serve",
  "build": "vue-cli-service build",
  "lint": "vue-cli-service lint"
}
```

# Vuetifyの追加

せっかくWebアプリを作るならカッコいいデザインで作りたいです．VuetifyはVue.jsに対応したマテリアルデザインのCSSフレームワークです．UIコンポーネントがいろいろと揃っているのと，ドキュメントもしっかりとしているのでお手軽にカッコいい画面が作れます．

[https://vuetifyjs.com/ja/](https://vuetifyjs.com/ja/)

Vuetifyは既存のアプリに自前でnpm install，importして使っていくことも簡単にできますが，今回はVue CLIから追加して使いました．このときも対話形式となっていますが，今回は`Default`を選択しました．

```console
$ vue add vuetify
```

インストールの他，Vuetifyのimportや必要なCSSの読み込みも行うようにファイルが更新されています．また先ほど確認したWelcomeページもVuetify仕様に更新されています．
これだけでVuetifyを使っていく準備はOKです．

![01.png](https://qiita-image-store.s3.amazonaws.com/0/45310/dd315f2e-f07b-ddb4-58f1-14b522f148a2.png)

# Vue RouterとVuexを使う
はじめにプロジェクトを作成するときにRouterやVuexを選択していると，すぐに使っていける状態になっています．どちらもちょっとしたWebアプリを作るような段階からでも便利なものになっていると思うので，ぜひVue.jsの入門段階からでも触ってみるといいと思います．

## Vue Router

Vue RouterはVue.js公式ルータです．複数のページの切り替えを簡単に実現することができます．
すでに`router.js`がプロジェクト内に存在しているので，その中を見れば使い方はなんとなくわかるかと思います．`path`で指定したURLと`component`で指定したVueコンポーネントが結びつきます．`name`は任意ですが名前を付けておくとその名前を利用して遷移先を定義することができます．

```javascript:router.js
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('./views/About.vue')
    }
  ]
})
```

その他の詳しい使い方はこちらで確認してください．
[https://router.vuejs.org/ja/](https://router.vuejs.org/ja/)

## Vuex

VuexはVue.jsアプリケーションの状態を保持するコンテナです．複数のVueコンポーネント間で共通のデータを扱うことができます．
通常は親子関係のあるVueコンポーネント間では`prop`と`emit`を使って情報を受け渡すことができますが，直接的な親子関係にないVueコンポーネント間では直接的には情報のやり取りが行えず構造が複雑になってしまいます．Vuexを使うとこれをシンプルに解決することができます．

こちらもすでに`store.js`がプロジェクト内に存在しています．簡単な例として`state`と`mutations`に実装を追加しています．stateに共有したいデータ，mutationsにそのデータの更新処理を定義します．

```javascript:store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
  }
})
```

stateの情報を取得するときには`store.state`から，mutationsの処理を呼びさすときには`store.commit`を使って呼び出すことができます．

```vuejs
<template>
  <p>{{$store.state.count}}</p>
</template>

<script>
export default {
  mounted: function () {
    this.$store.commit('increment')
  }
}
</script>
```

その他の詳しい使い方はこちらで確認してください．
[https://vuex.vuejs.org/ja/](https://vuex.vuejs.org/ja/)

# Firebaseとの連携

FirebaseはいわゆるBaaSです．DBやホスティング，認証機能などが簡単に利用できます．Vue.jsで作ったアプリケーションにバックエンドの機能を簡単に付け加えることができて，お試しで作っているWebアプリにも便利です．
詳細は本家のドキュメントを見るといいと思いますが，ここでは簡単にホスティングについてをまとめます．

## Firebaseのセットアップ

まずは[Firebaseのサイトのトップ](https://firebase.google.com)にある`スタートガイド`からGoogleアカウントでログインします．ログイン後に遷移するページからプロジェクトの追加を行います．プロジェクト名とID（URLに使われます），アナリティクスの地域などを設定してプロジェクトを作成します．
作成したプロジェクトのOverviewのページにある『開始するにはアプリを追加してください』のところの`</>`まるボタンを押して，Firebaseの初期化コードを確認しておきます．

![01.png](https://qiita-image-store.s3.amazonaws.com/0/45310/c3383c1a-5b93-8baa-cd4b-75fb02898ee0.png)

## コードの更新

Firebaseを使った開発に必要なパッケージのインストールを行います．`firebase`はコード上でFirebaseを扱うためのパッケージです．`firebase-tools`はFirebaseのCLIでの開発に使用します．

```console
$ npm install --save firebase
$ npm install --save-dev firebase-tools
```

次に前の工程で確認しておいたFirebaseの初期化コードを実装します．またサイト上の初期化コードはHTMLのScriptタグでfirebaseを読み込んで初期化処理をお行うようになっていましたが，今回はnpmでfirebaseをインストールして`main.js`上に初期化コードを書きました．

```javascript:main.js
import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
import store from './store'
import firebase from 'firebase'

Vue.config.productionTip = false

var config = {
  // サイトで確認した内容
}
firebase.initializeApp(config)

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
```

## デプロイ

まずはデプロイするファイルを用意します．

```console
$ npm run build
```

次にFirebase CLIを使ってFirebase関連のセットアップを行います．`login`ではFirebaseのサイトからプロジェクトの作成を行ったときのアカウントでログインします．`init`のときには`Hosting`を選択し，先ほどセットアップしたプロジェクトを選択してください．また公開ディレクトリ名は`npm build`したときの出力先がデフォルトで`dist`ディレクトリになっているのでpublicからdistに変更しました．その他はデフォルト設定のままで試しました．

```console
$ npx firebase login
$ npx firebase init
```

また自分が試した時は，たまにinitでプロジェクトが選択できなかったため，後から次のコマンドでプロジェクトとの指定を行いました．

```console
$ npx firebase use --add
```

最後にデプロイを実施します．

```console
$ npx firebase deploy
```

デプロイに成功すると，Firebaseのサイトの作成したプロジェクトのOverviewページで，デプロイの履歴が残っています．
Hostingのページを見るとデプロイされたURLが載っているので，アクセスするとローカル環境で確認していた時と同様にWelcomeページが表示されます．

その他のFirebaseの詳しい使い方は本家ドキュメントで確認してください．DBや認証機能も割と手軽に扱うことができます．
[https://firebase.google.com/docs/](https://firebase.google.com/docs/)

# Electronを試してみる

最後におまけ要素ですが，Vue.jsで作ったWebアプリをElectronアプリにして動かしてみます．
ElectronはWindows/macOS/Linuxで実行できるデスクトップアプリをHTML+CSS+JavaScriptといったWeb技術で開発できるフレームワークです．有名どころだとAtomやVSCodeがElectronでできています．
Vue CLI 3を使うと簡単にElectronで動かすことができたので紹介します．

まずは次のコマンドで`electron-builder`をインストールします．バージョンの選択がありましたが今回は`4.0.0`を選択しました．（自分の環境だと3はエラーが出てインストールできませんでした．）

```console
$ vue add electron-builder
```

`package.json`を見るとnpm-scriptsにElectron関連のコマンドが追加になっています．`electron:serve`や`electron:build`から起動や実行ファイルのビルドを行うことができます．

```console
$ npm run electron:serve    # Electronで起動
$ npm run electron:build    # 実行ファイルの生成
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/45310/751dbb0c-cdb3-16bd-a991-940b0c72b44a.png)

# おわりに

ここまでの準備ができれば，あとは工夫次第でいろいろなWebアプリを作っていけると思います．入門としては例えばチャットアプリやマークダウンエディタ，ToDoアプリなどがよくネット上にもチュートリアル形式なんかであがっていたりします．これらを参考にしながら自分のオリジナルのWebアプリを作っていくと面白いと思います．