組織多種功能

當您將 Cloud Functions 集成到您的項目中時,您的代碼可以擴展為包含許多獨立的函數。您可能有太多的功能無法合理地放在一個文件中,或者不同的團隊可能會部署不同的功能組,從而產生一個團隊覆蓋或意外刪除另一個團隊的功能的風險。 Cloud Functions 提供了不同的方式來組織您的代碼,以便更輕鬆地導航和維護您的函數。

在代碼庫中組織函數

您可以使用firebase.json中函數配置對象的codebase屬性來管理單個存儲庫 monorepo 設置中跨多個存儲庫或子包的大量函數:

# firebase.json
"functions": {
  "codebase": "my-codebase"
  # NOTE: Codebase must be less than 63 characters and can contain only
  # lowercase letters, numeric characters, underscores, and dashes.
}

Firebase CLI v10.7.1 及更高版本支持codebase屬性。

管理多個存儲庫

codebase屬性可以幫助簡化多個存儲庫的管理。讓我們檢查一個案例,您有兩個不同的存儲庫將函數部署到同一個 Firebase 項目:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

如果沒有代碼庫註釋,Firebase CLI 會提示您在部署時刪除在其他存儲庫中定義的函數:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
        fn1FromRepoB
        fn2FromRepoB
        ...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

您可以通過在每個項目存儲庫的firebase.json的函數配置部分添加唯一的代碼庫註釋來避免此問題:

# repoA/firebase.json
"functions": {
  "codebase": "repo-a"
}

# repoB/firebase.json
"functions": {
  "codebase": "repo-b"
}

使用代碼庫註釋,Firebase CLI 不再提示您刪除在直接存儲庫之外定義的函數:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
#  Gleefully ignores functions from repoB
i  functions: creating Node.js 16 function fnFromRepoA (us-central1)...
✔  Deploy Complete!

管理多個源包(monorepo)

codebase屬性可以幫助簡化單個存儲庫中多個源包的管理。讓我們檢查一個案例,其中您有一個 firebase 項目目錄,其中函數定義分佈在多個子包中:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

此設置適合以下用例:

  • 你有一個monorepo設置,並且有不同的團隊在一個獨立的包中管理他們自己的函數定義。
  • 您有一個函數具有嚴重的外部依賴性和長時間運行的初始化,並且希望將該函數與其他對延遲敏感的函數隔離開來。

要支持這樣的 monrepo 設置,請在firebase.json中定義多個功能配置:

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

使用此配置,Firebase CLI 在單個部署命令中部署所有包中的功能:

$ firebase deploy --only functions
i  deploying functions
i  functions: preparing codebase team-a for deployment
i  functions: preparing codebase team-b for deployment
i  functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i  functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...

您還可以部署特定的代碼庫:

$ firebase deploy --only functions:team-b
i  deploying functions
i  functions: preparing codebase team-b for deployment
i  functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...

在多個文件中編寫函數

開始使用 Cloud Functions 時,您可能會將前幾個函數放在一個文件中:

index.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

如果使用多個功能,這可能會變得難以管理。相反,您可以將每個函數的所有邏輯放在其自己的文件中,並將index.js文件用作簡單的導出列表:

foo.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js


const functions = require('firebase-functions');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.js


const foo = require('./foo');
const bar = require('./bar');
exports.foo = foo.foo;
exports.bar = bar.bar;

組功能

在許多項目中,功能可以分成應該一起部署和維護的邏輯組。例如,您可能有一組用於報告指標的函數:

metrics.js


const functions = require('firebase-functions');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

index.js文件中導出這些函數時,可以將它們放入一個組中:

index.js


// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

部署時,函數將以其組的名稱為前綴,因此在此示例中,函數將命名為metrics-usageStatsmetrics-nightlyReport

部署功能時,您可以將操作限制為單個組:


firebase deploy --only functions:metrics

下一步

要了解有關 Cloud Functions 的更多信息,請參閱: