【FlutterWeb】Firebase Hosting でWebアプリを公開する

この記事は、
[softdeviceのみんなでゆるく記事を書く。 Advent Calendar 2020](https://adventar.org/calendars/5794)
の12/5の記事として公開しています。
(Flutter2.2に合わせて、2021月6月1日に更新しました。)

#はじめに
FlutterWebプロジェクトを、Webアプリとして公開する方法の紹介です。
公開する手段はたくさんありますが、この記事ではFlutterと同じGoogleのサービス [Firebase Hosting](https://firebase.google.com/docs/hosting/) を使います。
Flutterを始めたばかりの人でも、30分ほどでWebアプリを公開できます。

![スクリーンショット 2020-12-15 10.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/801734af-5b68-ee83-b5b2-ba2a82a7a3c1.png)


#FlutterWeb プロジェクトの作成
Flutter2.0 からは、FlutterWebが安定版（stable）に統合されましたので、この項目はスキップしてください。

~~まず、FlutterWebを有効にします。
現時点では、まだ安定版（stable）には統合されていないので、betaに切り替える必要があります。
Flutterの配信チャンネルについては[こちら](https://minpro.net/flutter-channel-version)が詳しいです。~~

~~ターミナルで次のコマンドを実行します。~~

```
# betaチャンネルの Flutter SDK に切り替え
$ flutter channel beta

# Flutter SDK の最新バージョンを取得する
$ flutter upgrade

# FlutterWeb を有効にする
$ flutter config --enable-web
```

以降は、Flutterプロジェクトを新規作成すると FlutterWeb 対応になります。

```
# Flutterプロジェクト(flutter_web)を作成
$ flutter create flutter_web
```

#Firebase プロジェクトの作成
Firebaseコンソールから「プロジェクトを追加」。プロジェクト名を入力して、続行。
![スクリーンショット 2020-12-14 16.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/251b00e3-fd69-4310-d648-8bb227232139.png)

GoogleAnalyticsを有効にするか。特に必要でなければ、無効でOK。
![スクリーンショット 2020-12-14 16.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/4936483c-4d4f-e671-4c48-3c885a147a9b.png)
しばらく待つと準備完了。

# Firebase Hosting の設定
Firebase Hosting の「始める」の手順通りに進めます。
![スクリーンショット 2020-12-15 11.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/0f0bc04a-8455-3717-9a69-1a45f6394aa7.png)
ターミナルで次のコマンドを実行します。

```
# Firebase CLIのインストール (初めての場合)
$ npm install -g firebase-tools

# Firebaseにログイン (初めての場合)
$ firebase login

# Firebaseプロジェクトを初期化
$ firebase init
```
Firebaseプロジェクト初期化の設定は、下記のとおり。

```
? Which Firebase CLI features do you want to set up for this folder? 
# どの機能を設定するか。Hosting を Spaceキーで選択して、 Enterキーを押す。

? Please select an option: 
# Use an existing project を選択。

? Select a default Firebase project for this directory: 
# 先ほど作成した Firebaseプロジェクト(flutter-web) を選択。

? What do you want to use as your public directory? build/web
# パブリックディレクトリの指定。build/webにする。

? Configure as a single-page app (rewrite all urls to /index.html)? Yes
# SPAとして設定するか。Noにするとサブディレクトリへのアクセスが403になるので、Yesに。

? Set up automatic builds and deploy with GitHub? No
# GitHubとの連携。必要なければ、No。
```

完了するとローカルプロジェクト内に2つのFirebaseファイルが作成されます。
![スクリーンショット 2020-12-15 12.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/f42b32b4-3b69-1c68-f695-c7069e800974.png)



#Firebase Hosting にデプロイ
ターミナルで次のコマンドを実行します。

```
# Flutterプロジェクトのビルド
$ flutter build web

#Firebaseへデプロイ
$ firebase deploy
```

これで、build/webに書き出されたファイルがFirebaseにデプロイされます。
![スクリーンショット 2020-12-15 13.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/07e3e566-74af-e2ce-3bf5-66b7938c2bff.png)
Hosting URLを開くとFlutterのサンプルデモが表示されるはずです。
これで、Webアプリ公開完了。

ちなみに、Webアプリはブラウザにキャッシュが残ります。
一旦リリースすると更新が反映されない…ということが起こるので厄介です。
デプロイに合わせてキャッシュを更新する方法を見つけたので、近いうちに書きたいと思います。

↑ 書きました。
[【FlutterWeb】Service Worker のキャッシュを更新する](https://qiita.com/fukusin/items/51b1f98fde15f7994a12)

#補足
###「 Firebase Hosting Setup Complete 」のまま、デプロイが反映されない
![firebase_deploy_browse_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535406/98f18b94-99ff-8cab-5ded-b6d832c37c4f.png)
デプロイに成功したにも関わらず、初期画面から変わらないことがありました。
この場合、Firebaseプロジェクトに適切なパブリックディレクトリが設定されていない可能性があります。

####対処法
Firebaseプロジェクトの初期化で作成されたファイルとディレクトリ(.firebaserc/firebase.json/ビルドファイル )を削除して、Firebaseプロジェクトの初期化からやり直しましょう。
[こちらの記事](https://shigu493.com/firebase-hosting%E3%81%A7%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%AF%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E8%87%AA%E5%88%86%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E5%8F%8D/)が参考になりました。


###FlutterWebを無効に戻すには

```
$ flutter config --no-enable-web
$ flutter channel stable
$ flutter upgrade
```

#参考記事
[How to Host a Flutter Web Project on Firebase Hosting](https://developer.school/hosting-a-flutter-web-project-on-firebase-hosting/)
[Firebase Hosting for Flutter Web Projects in 4 easy steps](https://medium.com/flutter-community/firebase-hosting-for-flutter-web-projects-in-4-easy-steps-d48d9ffecb4c)
[既存プロジェクトのFlutter Web適応 & Firebase Hosting公開](https://qiita.com/kogepan159/items/9911cf7be67012cf4956)