Kombinieren Sie Cloud Functions mit Firebase Hosting, um Ihre dynamischen Inhalte zu generieren und bereitzustellen, oder erstellen Sie REST-APIs als Microservices.
Mit Cloud Functions for Firebase können Sie Backend-Code als Reaktion auf HTTPS-Anfragen automatisch ausführen. Ihr Code wird in der Cloud von Google gespeichert und in einer verwalteten Umgebung ausgeführt. Sie müssen Ihre eigenen Server nicht verwalten und skalieren.
Beispiel-Anwendungsfälle und Beispiele für in Firebase Hosting integrierte Cloud-Funktionen finden Sie in unserer serverlosen Übersicht .
Verbinden Sie Cloud Functions mit Firebase Hosting
Dieser Abschnitt enthält ein exemplarisches Beispiel für die Verbindung einer Funktion mit Firebase Hosting.
Beachten Sie, dass Sie zur Verbesserung der Leistung bei der Bereitstellung dynamischer Inhalte optional Ihre Cache-Einstellungen optimieren können.
Schritt 1: Cloud-Funktionen einrichten
Stellen Sie sicher, dass Sie über die neueste Version der Firebase-CLI verfügen und Firebase Hosting initialisiert haben.
Ausführliche Anweisungen zur Installation der CLI und zur Initialisierung des Hostings finden Sie im Leitfaden „Erste Schritte“ für Hosting .
Stellen Sie sicher, dass Sie Cloud Functions eingerichtet haben:
Wenn Sie Cloud Functions bereits eingerichtet haben, können Sie mit Schritt 2: Erstellen und Testen einer HTTPS-Funktion fortfahren.
Wenn Sie Cloud Functions nicht eingerichtet haben:
Initialisieren Sie Cloud Functions, indem Sie den folgenden Befehl im Stammverzeichnis Ihres Projektverzeichnisses ausführen:
firebase init functions
Wenn Sie dazu aufgefordert werden, wählen Sie JavaScript aus (in diesem exemplarischen Beispiel wird JS verwendet).
Überprüfen Sie, ob sich in Ihrem lokalen Projektverzeichnis ein
functions
befindet (erstellt durch den Firebase-Befehl, den Sie gerade ausgeführt haben). In diesemfunctions
befindet sich der Code für Cloud Functions.
Schritt 2: Erstellen und testen Sie eine HTTPS-Funktion für Ihre Hosting-Site
Öffnen Sie
/functions/index.js
in Ihrem bevorzugten Editor.Ersetzen Sie den Inhalt der Datei durch den folgenden Code.
Dieser Code erstellt eine HTTPS-Funktion (mit dem Namen
bigben
), die auf HTTPS-Anfragen mit einemBONG
für jede Stunde des Tages antwortet, genau wie eine Uhr.const functions = require('firebase-functions'); exports.bigben = functions.https.onRequest((req, res) => { const hours = (new Date().getHours() % 12) + 1 // London is UTC + 1hr; res.status(200).send(`<!doctype html> <head> <title>Time</title> </head> <body> ${'BONG '.repeat(hours)} </body> </html>`); });
Testen Sie Ihre Funktionen lokal mit der Firebase Local Emulator Suite .
Führen Sie im Stammverzeichnis Ihres lokalen Projektverzeichnisses den folgenden Befehl aus:
firebase emulators:start
Greifen Sie über die von der CLI zurückgegebene lokale URL auf die Funktion zu, zum Beispiel:
.http://localhost:5001/ PROJECT_ID /us-central1/bigben
Besuchen Sie die Cloud Functions-Dokumentation, um mehr über HTTPS-Anfragen zu erfahren.
Im nächsten Schritt erfahren Sie, wie Sie über eine Firebase-Hosting-URL auf diese HTTPS-Funktion zugreifen, damit dynamische Inhalte für Ihre von Firebase gehostete Website generiert werden können.
Schritt 3: Leiten Sie HTTPS-Anfragen an Ihre Funktion
Mit Rewrite-Regeln können Sie Anfragen, die bestimmten Mustern entsprechen, an ein einzelnes Ziel weiterleiten. Die folgenden Schritte zeigen Ihnen, wie Sie alle Anfragen vom Pfad ../bigben
auf Ihrer Hosting-Site so leiten, dass sie die bigben
Funktion ausführen.
Öffnen Sie Ihre
firebase.json
-Datei .Fügen Sie im Abschnitt
hosting
die folgenderewrite
Konfiguration hinzu:"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/bigben", "function": { "functionId": "bigben", "region": "us-central1" // optional (see note below) "pinTag": true // optional (see note below) } } ] }
Bestätigen Sie, dass Ihre Weiterleitung wie erwartet funktioniert, indem Sie sie erneut mit den Firebase-Emulatoren testen.
Führen Sie im Stammverzeichnis Ihres lokalen Projektverzeichnisses den folgenden Befehl aus:
firebase emulators:start
Besuchen Sie die lokal gehostete URL für Ihre Website, wie sie von der CLI zurückgegeben wird (normalerweise
localhost:5000
), aber hängen Sie die URL mitbigben
an, etwa so:http://localhost:5000/bigben
Iterieren Sie Ihre Funktion und ihre Funktionalität für Ihre Website. Verwenden Sie die Firebase-Emulatoren, um diese Iterationen zu testen.
Wenn
region
in einemfunction
derhosting.rewrites
Konfiguration weggelassen wird, versucht die Firebase-CLI, die Region automatisch aus dem Quellcode der Funktion zu erkennen, der, wenn nicht angegeben, standardmäßigus-central1
ist. Wenn der Quellcode der Funktion nicht verfügbar ist, versucht die CLI, die Region anhand der bereitgestellten Funktion zu erkennen. Wenn sich die Funktion in mehreren Regionen befindet, erfordert die CLI die Angabe derregion
in derhosting.rewrites
Konfiguration.
Die
pinTag
Funktion ist nur in Cloud Functions für Firebase (2. Generation) verfügbar. Mit dieser Funktion können Sie sicherstellen, dass jede Funktion zum Generieren des dynamischen Inhalts Ihrer Website mit Ihren statischen Hosting-Ressourcen und Ihrer Hosting-Konfiguration synchronisiert bleibt. Mit dieser Funktion können Sie außerdem eine Vorschau Ihrer neu geschriebenen Funktionen auf Hosting-Vorschaukanälen anzeigen.Wenn Sie
"pinTag": true
zu einemfunction
derhosting.rewrites
Konfiguration hinzufügen, wird die „pinned“-Funktion zusammen mit Ihren statischen Hosting-Ressourcen und Ihrer Konfiguration bereitgestellt, selbst wenn Sieausführen. Wenn Sie eine Version Ihrer Website zurücksetzen, wird auch die Funktion „Angeheftet“ zurückgesetzt.
firebase deploy --only hosting Diese Funktion basiert auf Cloud Run-Tags , für die ein Limit von 1.000 Tags pro Dienst und 2.000 Tags pro Region gilt. Das bedeutet, dass nach Hunderten von Bereitstellungen die ältesten Versionen einer Site möglicherweise nicht mehr funktionieren.
Um die beste Leistung zu erzielen, koordinieren Sie Ihre Funktionen mit Hosting, indem Sie eine der folgenden Regionen auswählen:
-
us-west1
-
us-central1
-
us-east1
-
europe-west1
-
asia-east1
Besuchen Sie die Hosting-Konfigurationsseite für weitere Details zu Rewrite-Regeln . Sie können sich auch über die Prioritätsreihenfolge der Antworten für verschiedene Hosting-Konfigurationen informieren.
Beachten Sie, dass Sie zur Verbesserung der Leistung bei der Bereitstellung dynamischer Inhalte optional Ihre Cache-Einstellungen optimieren können.
Schritt 4: Stellen Sie Ihre Funktion bereit
Sobald Ihre Funktion im Emulator wie gewünscht funktioniert, können Sie mit der Bereitstellung, dem Testen und der Ausführung mit echten Projektressourcen fortfahren. Dies ist ein guter Zeitpunkt, über die Festlegung von Laufzeitoptionen nachzudenken, um das Skalierungsverhalten für in der Produktion ausgeführte Funktionen zu steuern .
Stellen Sie Ihre Funktion sowie Ihren Hosting-Inhalt und Ihre Konfiguration auf Ihrer Site bereit, indem Sie den folgenden Befehl im Stammverzeichnis Ihres lokalen Projektverzeichnisses ausführen:
firebase deploy --only functions,hosting
Greifen Sie über die folgenden URLs auf Ihre Live-Site und Ihre Funktion zu:
Ihre Firebase-Subdomains:
PROJECT_ID .web.app/bigben
undPROJECT_ID .firebaseapp.com/bigben
Alle verbundenen benutzerdefinierten Domänen :
CUSTOM_DOMAIN /bigben
Verwenden Sie ein Webframework
Sie können Web-Frameworks wie Express.js in Cloud Functions verwenden, um den dynamischen Inhalt Ihrer App bereitzustellen und komplexe Web-Apps einfacher zu schreiben.
Der folgende Abschnitt enthält ein exemplarisches Beispiel für die Verwendung von Express.js mit Firebase Hosting und Cloud Functions.
Installieren Sie Express.js in Ihrem lokalen Projekt, indem Sie den folgenden Befehl in Ihrem
functions
ausführen:npm install express --save
Öffnen Sie Ihre Datei
/functions/index.js
, importieren und initialisieren Sie dann Express.js:const functions = require('firebase-functions'); const express = require('express'); const app = express();
Fügen Sie die folgenden zwei Endpunkte hinzu:
Fügen Sie den ersten Endpunkt hinzu, um den Index unserer Website unter
/
bereitzustellen.app.get('/', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.send(` <!doctype html> <head> <title>Time</title> <link rel="stylesheet" href="/style.css"> <script src="/script.js"></script> </head> <body> <p>In London, the clock strikes: <span id="bongs">${'BONG '.repeat(hours)}</span></p> <button onClick="refresh(this)">Refresh</button> </body> </html>`); });
Und ein weiterer Endpunkt, um die
BONG
Zählung als API im JSON-Format unter/api
zurückzugeben:app.get('/api', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.json({bongs: 'BONG '.repeat(hours)}); });
Exportieren Sie die Express.js-App als HTTPS-Funktion:
exports.app = functions.https.onRequest(app);
Leiten Sie in Ihrer Datei
firebase.json
alle Anfragen an dieapp
Funktion. Durch diese Umschreibung kann Express.js die verschiedenen von uns konfigurierten Unterpfade bedienen (in diesem Beispiel/
und/api
).{ "hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "**", "function": "app" } ] } }
Fügen Sie Middleware hinzu
Wenn Sie unser Beispiel fortsetzen, können Sie nun, da Sie Express.js verwenden, die Express.js-Middleware auf die übliche Weise hinzufügen. Sie können beispielsweise CORS- Anfragen auf unseren Endpunkten aktivieren.
Installieren Sie die
cors
-Middleware, indem Sie den folgenden Befehl ausführen:npm install --save cors
Öffnen Sie Ihre
/functions/index.js
und fügen Sie danncors
zu Ihrer Express.js-App hinzu, etwa so:const cors = require('cors')({origin: true}); app.use(cors);
Besuchen Sie die Cloud Functions-Dokumentation, um mehr über die Verwendung von Firebase mit Express-Apps und Middleware-Modulen zu erfahren.
Nächste Schritte
Richten Sie Caching für Ihre dynamischen Inhalte in einem globalen CDN ein .
Interagieren Sie mit anderen Firebase-Diensten über das Firebase Admin SDK .
Überprüfen Sie die Preise sowie die Kontingente und Limits für Cloud Functions.