Organisieren Sie mehrere Funktionen

Wenn Sie Cloud Functions in Ihr Projekt integrieren, könnte Ihr Code so erweitert werden, dass er viele unabhängige Funktionen enthält. Möglicherweise haben Sie zu viele Funktionen, um vernünftigerweise in eine einzelne Datei zu passen, oder verschiedene Teams können unterschiedliche Gruppen von Funktionen bereitstellen, wodurch das Risiko entsteht, dass ein Team die Funktionen eines anderen Teams überschreibt oder versehentlich löscht. Cloud Functions bietet verschiedene Möglichkeiten, Ihren Code zu organisieren, um die Navigation und Wartung Ihrer Funktionen zu vereinfachen.

Organisieren Sie Funktionen in Codebasen

Sie können die Eigenschaft codebase des Konfigurationsobjekts functions in firebase.json verwenden, um eine große Sammlung von Funktionen über mehrere Repositories oder Unterpakete hinweg innerhalb eines einzigen Repository-Monorepo-Setups zu verwalten:

# 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.
}

Die codebase -Eigenschaft wird in Firebase CLI v10.7.1 und höher unterstützt.

Verwalten mehrerer Repositories

Die codebase -Eigenschaft kann dabei helfen, die Verwaltung mehrerer Repositories zu vereinfachen. Sehen wir uns einen Fall an, in dem Sie zwei verschiedene Repositories haben, die Funktionen für dasselbe Firebase-Projekt bereitstellen:

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

Ohne Codebase-Anmerkungen hätte die Firebase-CLI Sie aufgefordert, zum Zeitpunkt der Bereitstellung im anderen Repository definierte Funktionen zu löschen:

$ (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)

Sie können dieses Problem vermeiden, indem Sie in jedem Projekt-Repository eine eindeutige Codebase-Anmerkung im Funktionskonfigurationsabschnitt von firebase.json hinzufügen:

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

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

Mit der Codebase-Anmerkung fordert Sie die Firebase-CLI nicht mehr auf, Funktionen zu löschen, die außerhalb Ihres unmittelbaren Repositorys definiert sind:

$ (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!

Verwalten mehrerer Quellpakete (Monorepo)

Die codebase -Eigenschaft kann dabei helfen, die Verwaltung mehrerer Quellpakete in einem einzigen Repository zu vereinfachen. Lassen Sie uns einen Fall untersuchen, in dem Sie ein Firebase-Projektverzeichnis mit Funktionsdefinitionen haben, die auf mehrere Unterpakete verteilt sind:

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

Dieses Setup eignet sich für die folgenden Anwendungsfälle:

  • Sie haben ein Monorepo- Setup und lassen verschiedene Teams ihre eigenen Funktionsdefinitionen in einem isolierten Paket verwalten.
  • Sie haben eine Funktion mit starker externer Abhängigkeit und langwieriger Initialisierung und möchten diese Funktion von anderen latenzempfindlichen Funktionen isolieren.

Um ein solches Monrepo-Setup zu unterstützen, definieren Sie mehrere Funktionskonfigurationen in firebase.json :

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

Mit dieser Konfiguration stellt die Firebase-CLI Funktionen aus allen Paketen in einem einzigen Bereitstellungsbefehl bereit:

$ 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)...
...

Sie können auch eine bestimmte Codebasis bereitstellen:

$ 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)...
...

Schreiben Sie Funktionen in mehrere Dateien

Wenn Sie mit Cloud Functions beginnen, können Sie Ihre ersten Funktionen in einer einzigen Datei speichern:

index.js


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

Dies kann mit mehr als ein paar Funktionen schwierig werden. Stattdessen können Sie Ihre gesamte Logik für jede Funktion in eine eigene Datei einfügen und Ihre index.js -Datei als einfache Liste von Exporten verwenden:

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;

Gruppenfunktionen

In vielen Projekten können Funktionen in logische Gruppen unterteilt werden, die gemeinsam bereitgestellt und gewartet werden sollten. Beispielsweise könnten Sie eine Gruppe von Funktionen haben, die für die Berichterstellung von Metriken verwendet werden:

metrics.js


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

Sie können diese Funktionen in einer Gruppe zusammenfassen, wenn Sie sie in Ihre index.js -Datei exportieren:

index.js


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

Bei der Bereitstellung wird den Funktionen der Name ihrer Gruppe vorangestellt, sodass die Funktionen in diesem Beispiel metrics-usageStats und metrics-nightlyReport .

Beim Bereitstellen von Funktionen können Sie die Aktion auf eine einzelne Gruppe beschränken:


firebase deploy --only functions:metrics

Nächste Schritte

Weitere Informationen zu Cloud Functions finden Sie unter: