Mit den Firebase Data Connect-Client-SDKs können Sie Ihre serverseitigen Abfragen und Mutationen direkt über eine Firebase-App aufrufen. Sie generieren ein benutzerdefiniertes Client-SDK parallel zur Entwicklung der Schemas, Abfragen und Mutationen, die Sie für Ihren Data Connect-Dienst bereitstellen. Anschließend binden Sie Methoden aus diesem SDK in Ihre Clientlogik ein.
Wie bereits erwähnt, ist es wichtig zu beachten, dass Data Connect-Abfragen und ‑Mutationen nicht vom Clientcode gesendet und auf dem Server ausgeführt werden. Stattdessen werden Data Connect-Vorgänge bei der Bereitstellung auf dem Server wie Cloud Functions gespeichert. Das bedeutet, dass Sie entsprechende clientseitige Änderungen bereitstellen müssen, um zu vermeiden, dass bestehende Nutzer (z. B. in älteren App-Versionen) Probleme haben.
Data Connect bietet Ihnen daher eine Entwicklungsumgebung und Tools, mit denen Sie Prototypen Ihrer serverbasierten Schemas, Abfragen und Mutationen erstellen können. Außerdem werden clientseitige SDKs automatisch generiert, während Sie Prototypen erstellen.
Wenn Sie die Aktualisierungen für Ihren Dienst und Ihre Client-Apps durchlaufen haben, können sowohl serverseitige als auch clientseitige Aktualisierungen bereitgestellt werden.
Wie sieht der Workflow für die Cliententwicklung aus?
Wenn Sie dem Startleitfaden gefolgt sind, haben Sie den allgemeinen Entwicklungsablauf für Data Connect kennengelernt. In diesem Leitfaden finden Sie detailliertere Informationen zum Generieren von Web-SDKs aus Ihrem Schema und zum Arbeiten mit Clientabfragen und ‑Mutationen.
Zusammenfassend lässt sich sagen, dass Sie die folgenden Voraussetzungen erfüllen müssen, um generierte Web-SDKs in Ihren Client-Apps zu verwenden:
- Fügen Sie Ihrer Web-App Firebase hinzu.
Gehen Sie anschließend so vor:
- App-Schema entwickeln
- Initialisieren Sie Ihren Clientcode mit dem JavaScript SDK oder den Bibliotheken React oder Angular.
- Für React und Angular installieren Sie Tanstack Query-Pakete.
SDK-Generierung einrichten:
- Mit der Schaltfläche SDK zur App hinzufügen in unserer VS Code-Erweiterung „Data Connect“
- Aktualisieren Sie die
connector.yaml
für das JavaScript SDK, React oder Angular.
Importieren Sie Bibliotheken und generierten Code mit dem JavaScript SDK oder React oder Angular.
Implementieren Sie Aufrufe von Abfragen und Mutationen mit dem JavaScript SDK, React oder Angular.
Testen Sie, indem Sie den Data Connect-Emulator mit dem JavaScript SDK, React oder Angular einrichten.
Clientcode mit dem Firebase JavaScript SDK implementieren
In diesem Abschnitt wird beschrieben, wie Sie Clients mit dem Firebase JavaScript SDK implementieren können.
Wenn Sie React oder Angular verwenden, finden Sie alternative Einrichtungsanleitungen und Links zu zusätzlicher Dokumentation zum Generieren von Data Connect-SDKs für Frameworks.
App initialisieren
Initialisieren Sie Ihre App zuerst mit der standardmäßigen Firebase-Sequenz.
initializeApp({...});
Generiertes JavaScript SDK installieren
Verwenden Sie die Firebase-Befehlszeile, um Data Connect-generierte SDKs in Ihren Apps einzurichten.
Mit dem Befehl init
sollten alle Apps im aktuellen Ordner erkannt und die generierten SDKs automatisch installiert werden.
firebase init dataconnect:sdk
Verbinden Sie Ihre App mit dem Data Connect-Dienst.
import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
const dataConnect = getDataConnect(connectorConfig);
// [Optionally] Configure the SDK to use Data Connect local emulator.
connectDataConnectEmulator(dataConnect, 'localhost', 9399);
SDKs während der Prototyperstellung aktualisieren
Wenn Sie die Data Connect VS Code-Erweiterung installiert haben, werden generierte SDKs immer auf dem neuesten Stand gehalten.
Wenn Sie die Data Connect VS Code-Erweiterung nicht verwenden, können Sie die generierten SDKs mit der Firebase-Befehlszeile auf dem neuesten Stand halten.
firebase dataconnect:sdk:generate --watch
SDKs in Build-Pipelines generieren
Mit der Firebase CLI können Sie Data Connect SDKs in CI/CD-Build-Prozessen generieren.
firebase dataconnect:sdk:generate
Bibliotheken importieren
Es sind zwei Importsätze erforderlich, um Ihren Clientcode zu initialisieren: allgemeine Data Connect-Importe und spezifische, generierte SDK-Importe.
Beachten Sie das Objekt ConnectorConfig
, das in den allgemeinen Importen enthalten ist.
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// generated queries and mutations from SDK
import { listMovies, ListMoviesResponse, createMovie, connectorConfig } from '@dataconnect/generated';
Abfragen aus dem JavaScript-SDK verwenden
Der generierte Code enthält bereits vordefinierte Query-Refs. Sie müssen sie nur importieren und „execute“ aufrufen.
import { executeQuery } from 'firebase/data-connect';
import { listMoviesRef } from '@dataconnect/generated';
const ref = listMoviesRef();
const { data } = await executeQuery(ref);
console.log(data.movies);
SDK-Abfragemethoden aufrufen
Hier ein Beispiel für die Verwendung dieser Aktionskürzel-Funktionen:
import { listMovies } from '@dataconnect/generated';
function onBtnClick() {
// This will call the generated JS from the CLI and then make an HTTP request out
// to the server.
listMovies().then(data => showInUI(data)); // == executeQuery(listMoviesRef);
}
Änderungen abonnieren
Sie können Änderungen abonnieren, die jedes Mal aktualisiert werden, wenn Sie eine Abfrage ausführen.
const listRef = listAllMoviesRef();
// subscribe will immediately invoke the query if no execute was called on it previously.
subscribe(listRef, ({ data }) => {
updateUIWithMovies(data.movies);
});
await createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi", rating: 5 });\
await listMovies(); // will update the subscription above`
Änderungen an Enumerationsfeldern verarbeiten
Das Schema einer App kann Aufzählungen enthalten, auf die über Ihre GraphQL-Abfragen zugegriffen werden kann.
Wenn sich das Design einer App ändert, können Sie neue unterstützte Enum-Werte hinzufügen. Angenommen, Sie entscheiden sich später im Lebenszyklus Ihrer Anwendung, der AspectRatio
-Enumeration einen FULLSCREEN-Wert hinzuzufügen.
Im Data Connect-Workflow können Sie lokale Entwicklungstools verwenden, um Ihre Abfragen und SDKs zu aktualisieren.
Bevor Sie jedoch eine aktualisierte Version Ihrer Clients veröffentlichen, kann es sein, dass ältere bereitgestellte Clients nicht mehr funktionieren.
Beispiel für eine robuste Implementierung
Fügen Sie einer switch
-Anweisung über den Enum-Werten immer einen default
-Zweig oder einem if/else if
-Block, der mit den Enum-Werten verglichen wird, einen else
-Zweig hinzu.
Dies wird von der JavaScript-/TypeScript-Sprache nicht erzwungen, ist aber die beste Methode, um Clientcode robust zu machen, falls neue Enum-Werte hinzugefügt werden.
const queryResult = await getOldestMovie();
if (queryResult.data) {
// we can use a switch statement's "default" case to check for unexpected values
const oldestMovieAspectRatio = queryResult.data.originalAspectRatio;
switch (oldestMovieAspectRatio) {
case AspectRatio.ACADEMY:
case AspectRatio.WIDESCREEN:
case AspectRatio.ANAMORPHIC:
console.log('This movie was filmed in Academy, widescreen or anamorphic aspect ratio!');
break;
default:
// the default case will catch FULLSCREEN, UNAVAILABLE or _UNKNOWN
// it will also catch unexpected values the SDK isn't aware of, such as CINEMASCOPE
console.log('This movie was was NOT filmed in Academy, widescreen or anamorphic.');
break;
}
// alternatively, we can check to see if the returned enum value is a known value
if (!Object.values(AspectRatio).includes(oldestMovieAspectRatio)) {
console.log(`Unrecognized aspect ratio: ${oldestAspectRatio}`);
}
} else {
console.log("no movies found!");
}
Mutationen aus dem JavaScript SDK verwenden
Auf Mutationen kann auf dieselbe Weise wie auf Abfragen zugegriffen werden.
import { executeMutation } from 'firebase/data-connect';
import { createMovieRef } from '@dataconnect/generated';
const { data } = await executeMutation(createMovieRef({ movie: 'Empire Strikes Back' }));
Verbindung zum Data Connect-Emulator herstellen
Optional können Sie eine Verbindung zum Emulator herstellen, indem Sie connectDataConnectEmulator
aufrufen und dann die Data Connect-Instanz übergeben:
import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
const dataConnect = getDataConnect(connectorConfig);
connectDataConnectEmulator(dataConnect, 'localhost', 9399);`
// Make calls from your app
Wenn Sie zu Produktionsressourcen wechseln möchten, kommentieren Sie die Zeilen aus, die für die Verbindung zum Emulator verwendet werden.
Clientcode für React und Angular implementieren
Firebase Data Connect bietet ein generiertes SDK mit Hooks für React und Angular, das Bibliotheken unserer Partner bei Invertase, TanStack Query Firebase, verwendet.
Diese Bibliothek bietet eine Reihe von Hooks, die die Verarbeitung asynchroner Aufgaben mit Firebase in Ihren Anwendungen erheblich erleichtern.
App initialisieren
Wie bei jeder Firebase-Web-App müssen Sie Ihre App zuerst mit der standardmäßigen Firebase-Sequenz initialisieren.
initializeApp({...});
TanStack Query Firebase-Pakete installieren
Installieren Sie Pakete für TanStack Query in Ihrem Projekt.
Reagieren
npm i --save @tanstack/react-query @tanstack-query-firebase/react
npm i --save firebase@latest # Note: React has a peer dependency on ^11.3.0
Angular
ng add @angular/fire
React- oder Angular-SDK generieren
Wie beim Standard-Web-SDK (siehe oben) werden SDKs in Firebase-Tools automatisch auf Grundlage Ihres Schemas und Ihrer Vorgänge generiert.
Wenn Sie Ihrem Projekt gerade React oder Angular hinzugefügt haben, führen Sie firebase init dataconnect:sdk
noch einmal aus, um die generierten SDKs neu zu konfigurieren und die zusätzlichen Framework-Bindungen einzuschließen.
Bibliotheken importieren
Es sind vier Importsätze erforderlich, um Ihren React- oder Angular-Clientcode zu initialisieren: allgemeine Data Connect-Imports, allgemeine TanStack-Imports und spezifische Imports für Ihre generierten JS- und React-SDKs.
Beachten Sie den Typ ConnectorConfig
, der in den allgemeinen Importen enthalten ist.
Reagieren
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// TanStack Query-related functions
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
// generated queries and mutations from SDK
import { ListMoviesResponse, connectorConfig } from '@dataconnect/generated';
// generated React hooks from SDK
import { useListAllMovies, useCreateMovie } from "@dataconnect/generated/react";
Angular
// general imports
import { ConnectorConfig, DataConnect, getDataConnect, QueryRef, MutationRef, QueryPromise, MutationPromise } from 'firebase/data-connect';
// TanStack Query-related functions
import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental";
// generated queries and mutations from SDK
import { ListMoviesResponse, connectorConfig } from '@dataconnect/generated';
// generated React hooks from SDK
import { injectListAllMovies, injectCreateMovie } from "@dataconnect/generated/angular";
Verwenden von Abfragen und Mutationen in Ihrem React- oder Angular-Client
Nachdem die Einrichtung abgeschlossen ist, können Sie Methoden aus dem generierten SDK einbinden.
Im folgenden Snippet sehen Sie die Methode useListAllMovies
mit dem Präfix use
für React und die Methode injectListAllMovies
mit dem Präfix inject
für Angular, die beide aus dem generierten SDK stammen.
Reagieren
Alle diese Vorgänge im generierten SDK, sowohl Abfragen als auch Mutationen, rufen TanStackQuery-Bindungen auf:
- Abfragen rufen den TanStack
useDataConnectQuery
-Hook auf und geben ihn zurück. - Mutationen rufen den TanStack-Hook
useDataConnectMutation
auf und geben ihn zurück.
import { useListAllMovies } from '@dataconnect/generated/react';
function MyComponent() {
const { isLoading, data, error } = useListAllMovies();
if(isLoading) {
return <div>Loading...</div>
}
if(error) {
return <div> An Error Occurred: {error} </div>
}
}
// App.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import MyComponent from './my-component';
function App() {
const queryClient = new QueryClient();
return <QueryClientProvider client={queryClient}>
<MyComponent />
</QueryClientProvider>
}
Angular
import { injectAllMovies, connectorConfig } from '@dataconnect/generated/angular';
import { provideDataConnect, getDataConnect } from '@angular/fire/data-connect';
import { provideTanStackQuery, QueryClient } from "@tanstack/angular-query-experimental";
const queryClient = new QueryClient();
...
providers: [
...
provideTanStackQuery(queryClient),
provideDataConnect(() => {
const dc = getDataConnect(connectorConfig);
return dc;
})
]
Abfragen mit automatischem Neuladen mit React und Angular verwenden
Sie können Abfragen so konfigurieren, dass sie automatisch neu geladen werden, wenn sich Daten ändern.
Reagieren
export class MovieListComponent {
movies = useListAllMovies();
}
export class AddPostComponent {
const mutation = useCreateMovie({ invalidate: [listAllMoviesRef()] });
addMovie() {
// The following will automatically cause Tanstack to reload its listAllMovies query
mutation.mutate({ title: 'The Matrix });
}
}
Angular
// class
export class MovieListComponent {
movies = injectListAllMovies();
}
// template
@if (movies.isPending()) {
Loading...
}
@if (movies.error()) {
An error has occurred: {{ movies.error() }}
}
@if (movies.data(); as data) {
@for (movie of data.movies; track movie.id) {
<mat-card appearance="outlined">
<mat-card-content>{{movie.description}}</mat-card-content>
</mat-card>
} @empty {
<h2>No items!</h2>
}
}
Verbindung zum Data Connect-Emulator herstellen
Optional können Sie eine Verbindung zum Emulator herstellen, indem Sie connectDataConnectEmulator
aufrufen und dann die Data Connect-Instanz an den generierten Hook übergeben:
Reagieren
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';
import { useListAllMovies } from '@dataconnect/generated/react';
const dc = getDataConnect(connectorConfig);
connectDataConnectEmulator(dc, 'localhost', 9399);
class AppComponent() {
...
const { isLoading, data, error } = useListAllMovies(dc);
...
}
Angular
// app.config.ts
import { provideDataConnect } from '@angular/fire/data-connect';
import { getDataConnect, connectDataConnectEmulator } from 'firebase/data-connect';
provideDataConnect(() => {
const dc = getDataConnect(connectorConfig);
connectDataConnectEmulator(dc, 'localhost', 9399);
return dc;
}),
Wenn Sie zu Produktionsressourcen wechseln möchten, kommentieren Sie die Zeilen aus, die für die Verbindung zum Emulator verwendet werden.
Datentypen im SDK
Der Data Connect-Server stellt allgemeine GraphQL-Datentypen dar. Sie werden im SDK so dargestellt:
Data Connect-Typ | TypeScript |
---|---|
Zeitstempel | String |
Datum | String |
UUID | String |
INT64 | String |
Doppelt | Zahl |
Float | Zahl |
SDKs während der Prototyperstellung aktualisieren
Wenn Sie die Data Connect VS Code-Erweiterung installiert haben, werden generierte SDKs immer auf dem neuesten Stand gehalten.
Wenn Sie die Data Connect VS Code-Erweiterung nicht verwenden, können Sie die generierten SDKs mit der Firebase-Befehlszeile auf dem neuesten Stand halten.
firebase dataconnect:sdk:generate --watch
SDKs in Build-Pipelines generieren
Mit der Firebase CLI können Sie Data Connect SDKs in CI/CD-Build-Prozessen generieren.
firebase dataconnect:sdk:generate