Firebase でリソースを共有しつつ、 SPA を2つに分けたかったので調べました。
1. 「複数サイトのホスティング」を使用する
-
Firebaseコンソールにアクセス
-
左のメニューから「Hosting」を選択
-
一番下にある「詳細設定」の「別サイトを追加」をクリック
-
サイト名を入力し「サイトの追加」をクリック
例として、デフォルトがexample-blog
、追加したのがexample-app
とします。 -
すでに
firebase init
を実行済みであれば、生成済みのfirebase.json
を修正するfirebase.json/* * フォルダ構成はこの様になっている前提 * /開発rootフォルダ * └/blog * └/dist (ビルド先フォルダ)// https://example-blog.web.app でホスティング * └/app * └/dist (ビルド先フォルダ) // https://example-app.web.app でホスティング * └/functions等 (あれば) * └firebase.json */ { // その他設定... "hosting": [{ "target": "blog", "public": "blog/dist", // その他設定... }, { "target": "app", "public": "app/dist", // その他設定... }] // その他設定... }
-
ビルドしてデプロイする
-
blog
app
ともにビルド -
すべてのサイトにデプロイ
firebase deploy --only hosting
-
指定したサイトだけにデプロイ
// 例:blogだけデプロイ firebase deploy --only hosting:blog
-
この方法の問題点
ドメインを同一にできなくなります。カスタムドメインを設定したとしても、どちらかはサブドメインを設定する必要が出てきます。(もしくは全く異なるドメイン)。
参考
2. 1つのサイトに複数のSPAをデプロイする
完成形イメージはこんな感じ。
/開発rootフォルダ
└/blog // ビルド先は public/blog 、
└/app // ビルド先は public/app にする
└/functions等
└/public
└/blog // ここを https://hogehoge.web.app/blog で、
└/app // ここを https://hogehoge.web.app/app でホスティング
-
firebase.json
を修正するfirebase.json{ "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], // rewritesルールを修正する "rewrites": [ { "source": "blog/**", "destination": "/blog/index.html" }, { "source": "app/**", "destination": "/app/index.html" } ] } }
-
Nuxt.js の
nuxt.config.js
を修正するrouter.base
を指定しないと、デプロイ後に/blog/.nuxt
ではなく/.nuxt
にあるスクリプトを参照してしまうため、必ず指定します。-
blog の
nuxt.config.js
blog/nuxt.config.jsexport default { // 略 router: { base: '/blog/', }, // 略 generate: { dir: '../public/blog', }, }
-
app の
nuxt.config.js
app/nuxt.config.jsexport default { // 略 router: { base: '/app/', }, // 略 generate: { dir: '../public/app', }, }
-
-
ルート
/index.html
にアクセスされた時の対応-
既存の
index.html
を差し替える -
firebase.json
を使ってリダイレクトするfirebase.json"hosting": { // 略 "redirects": [{ "source": "/", "destination": "/blog", "type": 302, }] // 略 }
-
-
ビルドしてデプロイ
-
blog
app
ともにビルド - デプロイ
個別のデプロイはできません。
firebase deploy --only hosting
-
2-2. 応用編
こんな感じにしたいですね。。
/開発rootフォルダ
└/blog // ビルド先は public 、
└/app // ビルド先は public/app にする
└/functions等
└/public // blog を https://hogehoge.web.app/ でホスティングしたい
└/app // app は https://hogehoge.web.app/app でホスティングしたい
-
firebase.json
のrewrites
redirects
を修正"rewrites": [ { "source": "/**", "destination": "/index.html" }, { "source": "app/**", "destination": "/app/index.html" }, "redirects": [{ "source": "/", "destination": "/index.html", "type": 302, }] ]
-
blog
のnuxt.config.js
を修正router
とgenerate
を修正しますblog/nuxt.config.jsrouter: { // 何も指定しなくてOK }, generate: { dir: '../public', },
-
あとはビルドしてデプロイ
この方法の問題点
blog
に app
というフォルダやページは作成できなくなります(ビルド時に上書きされる、または上書きしてしまうため)。