Migration von Extension zur Functions-Codebasis & npm-Paket
Übersicht
Migriert eine Firebase Extension in eines von zwei Zielen:
- Eine lokale Cloud Functions-Codebasis (
functions/src/für die App-Integration). - Ein veröffentlichtes npm-Paket (wiederverwendbares Open-Source-Paket, das V2-Funktionen exportiert).
Nutzt native Cloud Functions-Funktionen (deklaratives IAM, parametrisierte Konfiguration, SDK-Lifecycle-Hooks) und modernisiert Erstgeneration-Trigger auf die Zweite Generation mithilfe des Destrukturierungs-Kompatibilitäts-Shims.
Ziel-Migrationsworkflows
-
Ziel A: Lokale Functions-Codebasis (Endbenutzer-App-Integration)
- Ausgabe: Code unter
functions/src/. Konfiguration in.env. - Bereitstellung:
firebase deploy --only functions.
- Ausgabe: Code unter
-
Ziel B: Veröffentlichtes npm-Paket / Teilbares Paket
- Ausgabe: Wiederverwendbares npm-Paket, das V2-Funktionen exportiert.
- Konfiguration:
package.jsonmitexports-Map,engines: { "node": ">=22" }undpeerDependencies: { "firebase-functions": ">=6.0.0" }. - Nutzung: Konsumenten installieren das Paket und exportieren die Funktionen in
index.tserneut (export * from "<paket-name>").
Kernregeln & Einschränkungen
1. Deklaratives IAM & APIs (Kein lokaler Overhead)
Verwenden Sie native SDK-Deklarationen anstelle von manuellen gcloud-Skripten oder Konsolenanweisungen:
- Verwenden Sie
requiresRole("roles/...")für erforderliche GCP-IAM-Berechtigungen. - Verwenden Sie
requiresAPI("service.googleapis.com", "Beschreibung")für Google-APIs.
2. Einschränkung des globalen Parameterzugriffs
- Rufen Sie niemals
.value()auf der obersten Modul-Ladeebene auf. - Initialisieren Sie globale SDK-Instanzen innerhalb von
onInit()oder Lazy-Gettern:import { defineString } from "firebase-functions/params"; import { onInit } from "firebase-functions/v2"; const dataset = defineString("DATASET_ID"); let client: BigQuery; onInit(() => { client = new BigQuery({ datasetId: dataset.value() }); });
3. V2-Nebenläufigkeit & Kostenparität
V2 ermöglicht Nebenläufigkeit (bis zu 80 Anfragen). Um die V1-Einzelnebenläufigkeitspreise beizubehalten, setzen Sie cpu: "gcf_gen1".
Schritt-für-Schritt-Migrationsausführung
Schritt 1: Bestandsaufnahme der Extension-Ressourcen
extension.yaml:params→defineString,defineInt,defineBoolean,defineSecret.apis→requiresAPI(...).roles→requiresRole(...).lifecycleEvents→afterFirstDeploy&afterRedeploy.resources→ Upgrade von Erstgeneration-Triggern auf Zweite Generation (onDocumentWritten,onTaskDispatched,onRequest).
- Dateien & Skripte: Bewahren Sie devDependencies, Test-Framework (
jest) und Testskripte auf.
Schritt 2: Konfigurieren Sie package.json
- Setzen Sie
name: "<paket-name>",engines: { "node": ">=22" }. - Setzen Sie
peerDependencies:"peerDependencies": { "firebase-admin": "^11.0.0 || ^12.0.0", "firebase-functions": ">=6.0.0" } - Konfigurieren Sie die
exports-Map für ESM/CommonJS und TypeScript-Deklarationen (lib/index.js,lib/index.d.ts).
Schritt 3: Trigger von V1 auf V2 upgraden
- Firestore: Verwenden Sie
onDocumentWrittenausfirebase-functions/v2/firestore. - Tasks: Verwenden Sie
onTaskDispatchedausfirebase-functions/v2/tasks. Entfernen SieEXT_INSTANCE_IDbeim Einreihen von Tasks. - HTTP: Verwenden Sie
onRequestausfirebase-functions/v2/https. - Wenden Sie den Destrukturierungs-Kompatibilitäts-Shim (
{ change, context },{ snapshot, context }) an, wenn Legacy-Erstgeneration-Handler(change, context)erwarten.
Schritt 4: Lifecycle-Ereignisse konvertieren
Ordnen Sie Extension-Lifecycle-Ereignisse SDK-Lifecycle-Hooks in src/index.ts zu:
onInstall→afterFirstDeploy({ task: { function: "initTask" } })onUpdate/onConfigure→afterRedeploy({ task: { function: "setupTask" } })
Schritt 5: Paket-README & Exportanweisungen
Generieren Sie README.md mit:
- Installationsanweisungen (
npm install). - Re-Export-Snippet (
export * from "<paket-name>"). - Referenztabelle zur parametrisierten Konfiguration
.env. - Vergleichstabelle „Was hat sich geändert (Extension vs. Paket)“.
Hinweis: Führen Sie NIEMALS npm publish aus.