Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

組織多種功能

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

當您將 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 的更多信息,請參閱: