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", // その他設定... }] // その他設定... } -
ビルドしてデプロイする
-
blogappともにビルド -
すべてのサイトにデプロイ
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.jsblog/nuxt.config.jsexport default { // 略 router: { base: '/blog/', }, // 略 generate: { dir: '../public/blog', }, } -
app の
nuxt.config.jsapp/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, }] // 略 }
-
-
ビルドしてデプロイ
-
blogappともにビルド - デプロイ
個別のデプロイはできません。
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のrewritesredirectsを修正"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 というフォルダやページは作成できなくなります(ビルド時に上書きされる、または上書きしてしまうため)。