利用 Firebase 部署微前端專案 (Deploy and Host Micro Frontends Using Firebase)

利用 Firebase 部署微前端專案 (Deploy and Host Micro Frontends Using Firebase)

最近的 side project 剛好用到微前端 (micro frontends) 的架構來實作,過去大多都是一個 app 放一個 single-repo monolith,而這次是用 monorepo 來放 micro frontends 的眾多 app 們。先前提到 codebase 的規劃與安排app 間怎麼溝通,現在要來聊聊 deploy 與 hosting 的部份,在此選用 Firebase。

本文主要會談如何利用 Firebase 來部署與託管微前端專案,分為幾個部份:(1) 建立 Firebase 專案;(2) 建立 Firebase 設定檔;(3) 部署與託管;(4) 自動化部署;(5) 總結。

建立 Firebase 專案

首先從 Firebase 的 web console 建立 project,依提示一步步進行即可。

在 Firebase 建立 project

在建立專案時 Firebase 會提示是否要開啟 GA 功能,若希望做後續分析記得要維持開啟的狀態。

建立 project hello-world 成功!接下來會以它為範例。

在 Firebase 成功建立 project

建立 Firebase 設定檔

由於會用到 Firebase CLI 來產生設定檔和做部署,因此要安裝 Firebase CLI 工具。

yarn global add firebase-tools

安裝完畢後來做登入,在這裡會導向 Google 的登入網頁。

firebase login

Visit this URL on this device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=...

點選要登入的帳號。

firebase login

按下 Allow,授權 Firebase。

firebase login

登入成功。

firebase login

若是 CI 則帶入 token 登入即可 (見下方範例程式碼)。

接著要來產生一份設定檔,告訴 Firebase 要 deploy 的打包檔在哪裡、誰不用 deploy。

firebase init

這個指令是決定選擇要用 Firebase 的哪一個服務,選 Hosting: Configure files for Firebase Hosting… 這個選項。注意,要先按空白鍵才能選到該選項,直接按上下鍵 + Enter 是會出錯的。

Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices.

> Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys

選擇先前建立的 Firebase project,也就是選 Use an existing project 這個選項。

Please select an option:

> Use an existing project

可在選單看到剛才新建立的 project hello-world。

Select a default Firebase project for this directory

> hello-world

輸入路徑 dist 指出打包檔的位置。

What do you want to use as your public directory? dist

接下來的問答輸入 N 即可。

完成以上問答,Firebase 會產生 .firebasercfirebase.json

.firebaserc 範例。

{
  "projects": {
    "default": "hello-world"
  }
}

firebase.json 範例。

{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

由於要將各別 app 分別 deploy,所以會對每個 app 重複以上動作產生各自的設定檔,然後將這些設定檔放在 app 的資料夾底下。

檔案結構如下所示,這裡有兩個 app,分別是 app_hello 和 app_world,它們都有各自的設定檔。

這麼做的原因有二:(1) 每個 app 需要個別 deploy,而設定的內容稍有不同,因此最好還是擁有自己的設定檔;(2) 同一資料夾底下只能有一份 Firebase 的設定檔,因此必須放在不同資料夾。

├── assets
├── apps
│   ├── app_hello
|   |   ├── .firebaserc
|   |   ├── firebase.json
|   |   └── dist
│   ├── app_world
|   |   ├── .firebaserc
|   |   ├── firebase.json
|   |   └── dist
│   └── ...
├── dist
├── node_modules
├── utils
├── package.json
├── jest.config.js
├── yarn.lock
└── README.md

部署與託管

部署程式碼至 Firebase。

firebase deploy

部署完畢會顯示公開網址,點這個公開網址即可看到剛才部署的成果。

在 web console 的 Hosting 頁面可看到詳細資訊,像是部署的網址、時間、commit、用量等。

在 Firebase 成功建立 project

將以上的設定檔推到 repository 上,稍後來自動化這個 deploy 過程。

自動化部署

在這裡用 GitHub Action workflow 來做自動化部署,說明如下:

name: Deploy latest UI to Firebase
on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install Firebase CLI
        run: yarn global add firebase-tools
      - name: Install NX
        run: yarn global add nx
      - name: Install Dependencies in UI folder
        run: yarn install
      - name: Build
        run: yarn build
      - name: Copy app view build files under view folder
        run: cp -r dist/apps/app_hello apps/app_hello/dist
      - name: Copy app upload build files under upload folder
        run: cp -r dist/apps/app_world apps/app_world/dist
      - name: Deploy view to Firebase
        run: firebase deploy --token $.{.{ secrets.FIREBASE_TOKEN }.}.
        working-directory: apps/app_hello
      - name: Deploy upload to Firebase
        run: firebase deploy --token $.{.{ secrets.FIREBASE_TOKEN }.}.
        working-directory: apps/app_world

備註:由於部落格會把花括號吃掉,因此在左右加一個點,例如「.{.{ }.}.」。

在 GitHub repository 設定 Firebase token secret,加上剛剛寫好的 workflow,就可以讓專案在 merge master 的程式碼後,自動幫我們 deploy 到 Firebase 上了!完工!

總結

Firebase 提供一整套免費又方便的方案,讓開發者能以最小成本和最快速度得到產出,是非常好用的解法。

尤其是滿喜歡它的 Remote Config、Performance 以及 Analytics 功能。Remote Config 讓我能讀取一些需動態設定但又不想很麻煩的放在資料庫的資料;Performance 能很便利的蒐集和分析網站的效能資訊;Analytics 能很輕鬆的蒐集和分析使用者的瀏覽與操作資訊還有做 A/B testing。這幾個功能很棒很值得好好利用!


Firebase Firebase Hosting GitHub Actions Micro Frontends 微前端 front-end architecture Monorepo NX Memori