Nuxt.jsのWebアプリをFirebase(Cloud Functions/Firebase Hosting)でSSRする

f:id:jotaki:20200620195129p:plain

URL: https://nuxt-firebase-demo-1355e.web.app/
GitHub: https://github.com/yuheijotaki/nuxt-firebase

SSRなのでFirebaseの Cloud Functions と Firebase Hosting を使います。

AWSでいうと
Cloud Functions は Lambda、
Firebase Hosting は S3
という扱いですかね。

色々な記事見たのですが、手順としては firebase functionsでnuxt.js v2.11.0をSSR - Qiita が比較的新しくこの通りでできました。

他にもこの手の記事はたくさんありますが、
Nuxtのビルドフォルダなどディレクトリ構成がごっちゃになったり、そもそもSPAのものだったり、人によってWebアプリ作成とFirebaseの設定順が違ったりするので、とりあえず1記事でデプロイまでできる状態に持っていってから調整するところ調整したほうがいいかなと思います。

下記おおまかな手順です。

事前準備

リポジトリ作成。nodenvなどでnodeのバージョンは10系に合わせる。
functions側(Cloud Functions)のNode.jsでローカルと同じように動かないと詰まることになるので、今の所10系が安定していそう。

create-nuxt-app

Nuxtアプリを作ります。
starter-template だとうまくFirebase連携がうまくいかなかったという記事もあったのでcreate-nuxt-appがおすすめ。
モジュールとかリンターは好きなようにしてOK。
後でも変更可ですが Choose rendering mode Universal は SSR で。
作ったら nuxt.config.js の buildDirfunctions/nuxt にしておく。

Firebaseプロジェクト作成

コンソールから「プロジェクトを作成」 https://console.firebase.google.com/?hl=ja
アナリティクスはとりあえず無効にしておく。
Authentication や Database などいろいろ入ってますが使うのは Hosting と Functions。

firebase init

ここからはCLIインストールして操作
https://firebase.google.com/docs/cli?hl=ja

Mac npm だとうまくいかず curl でインストールした

$ curl -sL https://firebase.tools | bash

ログイン

$ firebase login

# ブラウザで認証後
Success! Logged in as XXXXX@gmail.com

ブラウザでFirebaseとの紐付け後にCLIのログインが確認される。
プロジェクトリストの表示

$ firebase projects:list
# さきほど作ったプロジェクト名が表示されればOK

プロジェクトのFirebase初期化

$ firebase init

# Which Firebase CLI features は 2つ選択
◉ Functions: Configure and deploy Cloud Functions
◉ Hosting: Configure and deploy Firebase Hosting sites

# さきほど作ったプロジェクトを選択
? Please select an option: Use an existing project
? Select a default Firebase project for this directory: nuxt-firebase-demo-1355e
 (nuxt-firebase-demo)
i  Using project nuxt-firebase-demo-1355e (nuxt-firebase-demo)
functions 設定

・firebase.json
rewrites function を nuxtApp

・functions/package.json
node のエンジンを 8 → 10 に
axios と dotenv のモジュール追加

・functions/index.js
Express つかってSSRするように設定。ここはコピペしました。

デプロイ
# ビルド
$ npm run build

# ローカルでデプロイ内容確認
$ firebase serve
http://localhost:5000/ で確認

# デプロイ
$ firebase deploy

感想

Firebaseの認証詰まったり、Cloud Functions 思ったよりハマりポイントたくさんありましたが一応SSRできるっていうのを試せてみたので良かったです。 サーバレスってこういうことなんだっていうのはやっぱり触ってみるとわかりやすいです。 もう少しルーティングとかうまくいくか検証しないと案件とかでは怖いですが

ほか参考