フロントエンドだけ作ったアプリをGitHubPagesからHerokuに移行する

## abstract

端的に言うと、GitHubPagesに公開している、フロントエンドのみで構成されたアプリケーションをHerokuに移行しました。

※今回のアプリケーションはVue-CLI + webpackのアプリケーションですが、そうでないアプリケーションを移行したい場合でも、基本的な流れは同じだと思います。

### 背景

過去にVue.jsで[ポケモンずかん](https://qiita.com/homusuke/items/8bbf96c750e9a6fcb2d2)を作りました。「ポケモンずかん」はバックエンドの実装をしておらず、フロントエンドのJavaScriptと外部のAPIだけで作ったものになります。「ポケモンずかん」の実装はフロントエンドのみなので、GitHubPagesでの公開が可能です。ですので、GitHubPagesに公開していました。しかし、Herokuを使えばGitHubPagesに頼ることなくデプロイできるようなので移行してみました。

### Heroku とは

Herokuは作成したアプリケーションを簡単にデプロイできるサービスです。Herokuは様々なバックエンドの主要な言語に対応しています。Herokuには有料プランがありますが、趣味程度のアプリケーションのためにHerokuを使うのであれば、無料の範囲で使えると思います。私は今後バックエンドを含めた何かしらのアプリケーションを作りたいと思っていたので、その意味でも、Herokuに挑戦してみました。もちろん、私のようにフロントエンドだけで構成されたアプリケーションをデプロイすることもできます。

### 手法

Herokuにデプロイするために、バックエンドに変わるモノは必要となります。なのでNode.jsを使ってサーバの肩代わりをしてもらいます。とはいえ、難しい手続きはありません。

HerokuはGitHubにpushする感覚に近く、簡単にデプロイすることができました。※後述します。

## 実行環境

| | version |
|:-:|:-:|
| Node.js | v11.15.0 |
| OS | macOS Catalina v10.15.7 |
| プロセッサ | Intel Core i5 |

## Herokuの利用

Herokuを利用するための手順を記述します。

### アカウント作成

1. [Heroku](https://signup.heroku.com/jp)で新規登録します。
2. メールが届きます。リンクをクリックして認証ページへ遷移します。
3. 手順に従い、パスワードの設定をします。

### Heroku CLIをインストール

`Homebrew`からインストールします。`Homebrew`をインストールしていない場合は別途インストールが必要です。

```
$ brew -v
Homebrew 2.6.0 // インストール済み
Homebrew/homebrew-core (git revision feacfd; last commit 2020-12-02)
```

インストールします。

```
$ brew tap heroku/brew && brew install heroku
```

バージョンが表示されれば完了です。

```
$ heroku -v
heroku/7.47.4 darwin-x64 node-v12.16.2
```

### Herokuにログイン

コマンドラインからログインします。アカウントを作成したときのメールアドレスとパスワードを入力します。

```
$ heroku login -i
heroku: Enter your login credentials
Email: "メールアドレス"
Password: "パスワード"
```

## ローカルリポジトリ

GitHubに保管している（もしくはGitHubPageで公開している）アプリケーションをローカルに落とします。

### GitHubからクローンを取得する

任意の場所に作業ディレクトリを作成します。

```
$ mkdir github //任意の名前
```

Gitの環境を構築します。

```
$ git init
```

リポジトリのクローンを取得します。

```
$ git clone 'Herokuで公開したいGitHubリポジトリのURL.git'
```

取得したアプリケーションの配下に移動します。

```
$ cd "アプリケーション"
```

## アプリケーションの編集

Vue.jsを実行するためにNode.jsの`Express`を使います。

### Expressのインストール

```
$ npm i express
```

`express`が`package.json`に追加されていることを確認できます。

```json
// package.json

//略記
{
  "dependencies": {
    "express": "^4.17.1",
  }
}
```
### server.js

`Express`に必要なファイルを用意します。

Herokuに実行してもらうソースコードのディレクトリ、つまりビルドしたソースコードのディレクトリを指定します。

※もし、GitHubPagesを利用して公開している人はビルドしたソースコードのディレクトリ名を`docs`にしていると思います。それに合わせて`docs`とすればOKです。

```js
// server.js

const express = require('express');
const serveStatic = require('serve-static');
app = express();
app.use(serveStatic(__dirname + "/docs")); // dist,socs等のディレクトリ名
const port = process.env.PORT || 5000;
app.listen(port);
console.log('server started '+ port);
```

### package.json

下記のように変更します。

```json
// package.json

//略記
{
  "scripts": {
    "start": "node server.js", // 変更
  }
}
```

### ビルド

落としてきたアプリケーションに必要なライブラリをインストールします。

```
$ npm i
```

ビルドします。

```
$ npm run build 
```

Herokuにデプロイ予定のアプリケーションをローカルで実行し、事前に確認できます。

```
$ node server.js
```

### Gitにコミット

```
$ git add .
$ git commit -am "メッセージ"
```

## Herokuの実行

コマンドを入力し、デプロイ先を作成します。
実行するとHeroku上のアプリケーション名とURLを取得できます。末尾が`.herokuapp.com/`のURLがデプロイ先です。

```
$ heroku create 'アプリケーション名'
```

デプロイします。

```
$ git push heroku master
```

## 動作確認

デプロイで表示されたURLにアクセスします。表示されていれば完了です。


## 終わりに

GitHubPagesに頼りきりでしたがバックエンドをデプロイすることはできないので、何か手ごろなものはないかと探した結果たどり着きました。次はバックエンドを含めて使ってみたいと思います。

最後まで読んでいただきありがとうございます。

もし間違っているところを見かけたらお教えください！🙏


## 追記

### config/index.jsを修正する

Github Pages用にファイルパスを編集していたのを忘れていました。忘れずにもとに戻しましょう。

```js:config/inidex.js
  // 省略
  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../docs/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../docs'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/', //修正
```