iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Vue.js

Nuxt.js 3.x 筆記-打造 SSR 專案系列 第 29

D29:Nuxt 3.x Universal(SSR)專案部署到 Firebase

  • 分享至 

  • xImage
  •  

本篇文章同步更新於個人部落格,歡迎交流指教~謝謝您的閱讀

專案開發完成後,終於到最後一步 「部署」,本篇將說明 Universal 專案部署到 Firebase。Universal 渲染模式需要伺服器才能運作,因此會搭配 Firebase Cloud Functions(Serverless)來協助處理 SSR 的部分。

Universal Rendering 相關說明可以參考 這篇文章

實作分為以下步驟:

  • 申請 Firebase Project
  • 透過 CLI 部署至 Firebase

申請 Firebase Project

Firebase Console 新增專案

開啟新增的專案,點擊建構 → 加入 Hosting 與 Function(需升級為付費方案,為 Pay as you go 制度,可以限制預算上限)

到此步 Firebase 專案就建立完成,先記著專案 ID,後面部署會使用到


透過 CLI 部署至 Firebase

接著回到我們的 Nuxt App

STEP1:安裝 CLI

首先安裝 Firebase CLI(Command-Line Interface)指令列工具

npm install firebase-tools

STEP2:登入 Firebase

接著透過指令登入 Firebase

firebase login

登入成功後會看到如下畫面

STEP3:初始化 firebase 專案

firebase init hosting

接著選擇預部署的 Firebase 專案 ID,也就是前面新增的專案

託管設定依序選擇如下,接著會自動產生 firebase.json.firebaserc 兩支檔案

注意: 必須要刪除上一步驟自動產生的 public/404.htmlpublic/index.html 兩個靜態檔,否則部署後畫面會受影響

https://ithelp.ithome.com.tw/upload/images/20231008/20130500iwMITjreYW.png

STEP4:配置 nuxt.config

  • preset:預設為 node.js server,調整為 firebase,當執行 npm run build 時,會產生符合 Firebase 託管所需的檔案內容
  • firebase.gen:預設使用第一代 Cloud Functions,這裡調整為二代(一、二代比較
// nuxt.config.js
export default defineNuxtConfig({
  nitro: {
    preset: 'firebase',
    firebase: {
      gen: 2
    }
  }
});

STEP5:配置 firebase.json.firebaserc

firebaserc

如果前面步驟運作順利,預期 .firebaserc 會綁定 Firebase 專案 ID 如下,不需異動

// .firebaserc
{
  "projects": {
    "default": "nuxt3-firebase-ca4cb"
  }
}

firebase.json

需手動調整,這個步驟很重要,會影響專案編譯結果

functions(Cloud Functions)

  • source:指定 Cloud Functions 程式碼路徑

hosting(Firebase Hosting)

  • site:Firebase 專案 ID
  • public:專案靜態目錄路徑
  • rewrites:改寫 URL 規則,所有的 URL 請求都會由名為「server」的 Cloud Functions 處理,也就是由伺服器端處理所有請求(SSR)
  • predeploy:部署前預先執行的指令。這一段的設定為:進到編譯後的 .output/server 資料夾,刪除 node_modules 並重新安裝,否則在執行部署時會發生找不到 firebase-functions 套件的錯誤

    注意:rm -rf node_modules 是 macOS 跟 Linux 的指令,Windows 須調整為 rmdir /s /q node_modules

// firebase.json
{
  "functions": {
    "source": ".output/server",
    "runtime": "nodejs18"
  },
  "hosting": {
    "site": "nuxt3-firebase-ca4cb",
    "public": ".output/public",
    "cleanUrls": true,
    "rewrites": [ {
      "source": "**",
      "function": "server"
    }],
    "predeploy": [
      "cd .output/server && rm -rf node_modules && npm install"
    ]
  }
}

STEP6:編譯與部署

首先將專案打包

npm run build

打包後的檔案放在根目錄 .output 資料夾內

.output/
|—— public/
  |—— ...
|—— server/
  |—— ...
|—— nitro.json

接著部署到 Firebase

firebase deploy

看到以下訊息表示部署成功囉!

Firebase 專案可以看到 Cloud Function 名稱預設為「server」

打開 Hosting URL,可以看到我們的網站,也可以透過儀表板查看發布紀錄與用量

範例檔:

本篇程式碼放在 GitHub 提供參考:連結


參考資源:

https://nitro.unjs.io/deploy/providers/firebase
https://firebase.google.com/docs/hosting/quickstart
https://www.youtube.com/watch?v=AzO-KVMx7lo


上一篇
D28:Nuxt 3.x 將靜態網站部署到 GitHub Pages
下一篇
D30:Nuxt 3.x 筆記:總結與感想
系列文
Nuxt.js 3.x 筆記-打造 SSR 專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
碼農
iT邦新手 4 級 ‧ 2023-12-24 18:22:03

板主好~

  1. 我在這一步
    " 到此步 Firebase 專案就建立完成,Cloud Function 名稱為 「server」"
    沒有那個畫面,只有

https://ithelp.ithome.com.tw/upload/images/20231224/20147822Z7mB9ji7g3.jpg

想請問如何產生同樣的畫面
(有升級方案,目前為blaze)

  1. 我的專案 和板主專案都會出現以下錯誤,應該就上第一點沒有成功

執行firebase deploy
會產生以下錯誤,沒有函式

i  functions: creating Node.js 18 (2nd Gen) function server(us-central1)...
⚠  functions: Your current project quotas don't allow for the current max instances setting of 100. Either reduce this function's maximum instances, or request a quota increase on the underlying Cloud Run service at https://cloud.google.com/run/quotas.
⚠  functions: You can adjust the max instances value in your function's runtime options:
        setGlobalOptions({maxInstances: 10})
Failed to create function projects/my-first-project-1110913/locations/us-central1/functions/server

Functions deploy had errors with the following functions:
        server(us-central1)
i  functions: cleaning up build files...

Error: There was an error deploying functions
看更多先前的回應...收起先前的回應...

碼農您好,

  1. 第一點應該是我的筆誤,要在部署完成後才會看到 Cloud Function 名稱,謝謝你的提醒(已修正)
  2. 第二點如果是 deploy funciton 的問題,可以試試在 nuxt.config 指定 serverFunctionName 如下:
export default defineNuxtConfig({
  nitro: {
    preset: 'firebase',
    firebase: {
      gen: 2,
      serverFunctionName: 'server'
    }
  }
})

如果是配額不足的問題,可以試看看規範最大 instance 數量(根據你提供的錯誤訊息):

export default defineNuxtConfig({
  nitro: {
    firebase: {
      // ...
      httpsOptions: {
        maxInstances: 10
      }
    }
  }
});
碼農 iT邦新手 4 級 ‧ 2023-12-26 10:18:20 檢舉

1.感謝~上次問題還沒測試是否可行(在mac),測試完再跟您回報一下

2.後來我是使用windows去執行,我想用您的nuxt專案,去部屬在我的firebase hosting中,去嘗試是否可成功部屬上去

在firebase deploy時有錯誤,我有改成win終端有的指令,但沒有遇到在mac部屬時遇到的問題 (上次提到的)

C:\Users\MSI_NB\Desktop\nuxt3-firebase-main>firebase deploy

=== Deploying to 'my-first-project-1110913'...

i  deploying functions, hosting
Running command: cd .output/server && rmdir /s /q node_modules && npm install
系統找不到指定的檔案。
系統找不到指定的檔案。
目錄不是空的。

Error: hosting predeploy error: Command terminated with non-zero exit code 145

Having trouble? Try firebase [command] --help
碼農 iT邦新手 4 級 ‧ 2023-12-26 21:00:24 檢舉

我的專案 ,去嘗試您的建議,還是一樣

i  functions: creating Node.js 18 (2nd Gen) function server(us-central1)...
⚠  functions: Your current project quotas don't allow for the current max instances setting of 100. Either reduce this function's maximum instances, or request a quota increase on the underlying Cloud Run service at https://cloud.google.com/run/quotas.
⚠  functions: You can adjust the max instances value in your function's runtime options:
        setGlobalOptions({maxInstances: 10})
Failed to create function projects/my-first-project-1110913/locations/us-central1/functions/server

Functions deploy had errors with the following functions:
        server(us-central1)
i  functions: cleaning up build files...

Error: There was an error deploying functions

我試著將你的專案部署到 firebase:連結,沒有設定 maxInstances,部署是順利的,看起來不是 Nuxt 設定的問題,不確定您 firebase 專案的配置,或許可以透過 Google Cloud Platform 來調整配額

碼農 iT邦新手 4 級 ‧ 2023-12-27 21:00:04 檢舉

why~~~~

1.配額有哪幾個,可以嘗試去調整嗎?或是您曾經調整過哪裡嗎?
因為我只有調整過預算的部份,其他都是預設才對呀 @"@

https://ithelp.ithome.com.tw/upload/images/20231227/20147822J7PM9LLdmY.png

https://ithelp.ithome.com.tw/upload/images/20231227/20147822jZdO2WMqTE.png

  1. 不知道跟服務帳戶多寡有沒有關係
    https://ithelp.ithome.com.tw/upload/images/20231227/20147822LnmHQ4CdsU.png

不確定是不是你的目標金額設定是0,這樣等於跟免費方案是一樣的

碼農 iT邦新手 4 級 ‧ 2023-12-28 20:24:39 檢舉

1.可以參考您的預算設定方式嗎
我目標金額設定100也是不行

2.您部屬我的專案時,也是這樣的順序嗎?(node ^18)

  • npm install firebase-tools
  • firebase login
  • firebase init hosting
  • 配置 firebase.json 與 .firebaserc(或其他設定)
  • npm run build
  • firebase deploy

想請問部署發生的錯誤是一樣的嗎?我在部署你的專案有發生 vue 版本衝突問題,解決後照以上順序可以成功部署,上述的金額設定也沒問題~
如果是前面提到的配額問題,看了一下你現在專案 maxInstances 設定不正確,應該要放在 firebase 物件內如下

export default defineNuxtConfig({
  nitro: {
    firebase: {
      gen: 2,
      httpsOptions: {
        region: 'us-central1',
        maxInstances: 10
      }
    }
  }
});

剛發現 Nuxt 官方有更新文件了,可以參考說明:連結

我要留言

立即登入留言