React+Firebaseで雑チャットアプリ作りたい① 開発環境を作る

ReactとFirebaseの連携部分を学ぶためにチャットアプリを作りたいと思いました。
調べたところすぐにできそうだと思ったのですがいくつかつまずいた部分を議事録として残します。

まずはFirebaseにデプロイできる環境を作っていきます。

## React開発環境を構築
シンプルな設定でいきたいと思います。
`npx create-react-app my-app`でサクッと構築するか自前で設定するかお好みで。

今回は下記の設定で実装していきます。

```package.json
{
  "scripts": {
    "start": "webpack-dev-server --mode development",
    "build": "webpack --progress --mode production"
  },
  "devDependencies": {
    "@babel/core": "^7.18.2",
    "@babel/preset-env": "^7.18.2",
    "@babel/preset-react": "^7.17.12",
    "babel-loader": "^8.2.5",
    "html-webpack-plugin": "^5.5.0",
    "webpack": "^5.72.1",
    "webpack-cli": "^4.9.2",
    "webpack-dev-server": "^4.9.0"
  },
  "dependencies": {
    "firebase": "^9.8.2",
    "react": "^18.1.0",
    "react-dom": "^18.1.0"
  }
}
```

本来は開発環境用と本番用を分けるべきですが、省略します。

```webpack.config.js
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: {
    'js/app': ['./src/App.jsx'],
  },
  output: {
    path: path.resolve(__dirname, 'public/'),
    publicPath: '/',
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        use: ['babel-loader'],
        exclude: ['/node_modules/'],
      },
    ],
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './src/index.html',
      filename: 'index.html',
    }),
  ]
}

```
```src/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

```

```src/App.jsx
import React from 'react';
import ReactDOM from 'react-dom';

const App = () => {
  return <h1>Hello React!!</h1>;
};
ReactDOM.render(<App />, document.getElementById('app'));

```

`yarn start`で[http://localhost:8080/](http://localhost:8080/)で確認できると思います。

## Firebaseの設定
次にFirebaseにデプロイするための環境を整えていきます。
package.jsonにfirebaseのモジュールをインストールする必要があります。
Firebaseのプロジェクトを作成したあとに実装のガイドが出てくるのでそれに従って実行していけばデプロイに必要な設定は完了できると思います。

[Firebaseでプロジェクトをつくる](https://firebase.google.com/?hl=ja)

◼️参考にした記事

https://qiita.com/hiroki-harada/items/ca22ac177db68e3c3796

### ローカル環境のセットアップ
◼️`firebase init`を実行、Hostingを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/fbf48521-efed-53ef-b030-61e1a26fd67d.png)
◼️`Use an existing project`を選択し、既存のプロジェクトを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/c0506a43-eb3b-0101-2844-2b7c9b3624f3.png)
◼️デプロイするディレクトリを選択します
`What do you want to use as your public directory?`

◼️シングルページアプリケーションの設定を有効にするかを選択します
`Configure as a single-page app (rewrite all urls to /index.html)?`

◼️Githubの自動ビルドとデプロイの設定
`Set up automatic builds and deploys with GitHub?`
「yes」とするGithubの認証画面がブラウザに表示されます。
Githubのパスワードを入力すれば完了です。

◼️リポジトリを選択します。
`For which GitHub repository would you like to set up a GitHub workflow?`

◼️デプロイ前にビルドするかどうかの設定
`Set up the workflow to run a build script before every deploy?`
今回はReactなのでyesを選択します。

◼️デプロイする前に動かすビルドスプリクトを入力する
`What script should be run before every deploy?`
デフォルトでは`npm ci && npm run build`よければEnter。

◼️プルリクエストがマージされた時に本番にマージするか
`Set up automatic deployment to your site's live channel when a PR is merged?`

◼️本番にマージする場合の対象ブランチを選択します
デフォルトのmainで設定しておきます。

ここまで終わったらディレクトリ内に`firebase.json`が作成されます。

## Firebaseにデプロイする
`firebase deploy`のコマンドを叩けばデプロイが完了すると思います。
完了しれば指定されたURLに接続することでローカル環境と同様の表示が確認できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/9e051b5c-ae89-f243-cbd4-c3c7948fcf5d.png)

### 問題発生時のTips集
デプロイの設定が完了するまでに出会ったエラーの対処方法をTipsとして残します。
お役立ていただけると幸いです。

#### プロジェクト一覧表示が失敗して、`firebase init`が完了しない
`firebase init`を実行した際に、`Failed to list Firebase projects`というエラーが出る場合があります。
firebase-toolsをアップグレードすると認証トークンが無効になる場合があるらしく一度ログアウトしてログインしたら直りました。

```
$ firebase init
     ######## #### ########  ######## ########     ###     ######  ########
     ##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##
     ######    ##  ########  ######   ########  #########  ######  ######
     ##        ##  ##    ##  ##       ##     ## ##     ##       ## ##
     ##       #### ##     ## ######## ########  ##     ##  ######  ########

// 途中省略

// errorが出る
Error: Failed to list Firebase projects. See firebase-debug.log for more info.

// debug.logを見ろと言われる
Having trouble? Try again or contact support with contents of firebase-debug.log

// Errorには、認証情報おかしい的なことが書かれている
Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential

// 結局は下記で解決
$ firebase logout
$ firebase login
```

#### `firebase init`でHostingが選択できない…は全角入力になっているから
`firebase init`を実行すると下記のようにどうしますか？と選択肢を表示してくれます。
矢印キーで上下させスペースキーで選択して、Enterを押す。
だけのはずなのに何故か画像のようにセレクトされない（緑の丸印）場合は「全角入力」になっていると思うので半角入力に直して試してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/fbf48521-efed-53ef-b030-61e1a26fd67d.png)

#### `firebase deploy`で反映されない！
僕の場合はChromeのキャッシュでした。
デプロイ後にシークレットブラウザで確認してみてください。