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 提供了不同的方式來組織您的代碼,以便更輕鬆地導航和維護您的函數。

在代碼庫中組織函數

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

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