Generierte Web-SDKs verwenden

Mit den Firebase SQL Connect Client-SDKs können Sie Ihre serverseitigen Abfragen und Mutationen direkt über eine Firebase-App aufrufen. Sie generieren parallel ein benutzerdefiniertes Client-SDK, während Sie die Schemas, Abfragen und Mutationen entwerfen, die Sie für Ihren SQL 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 SQL Connect Abfragen und Mutationen nicht vom Clientcode gesendet und auf dem Server ausgeführt werden. Stattdessen werden SQL Connect Vorgänge nach der Bereitstellung wie Cloud Functions auf dem Server gespeichert. Das bedeutet, dass Sie entsprechende clientseitige Änderungen bereitstellen müssen, um Probleme für bestehende Nutzer zu vermeiden (z. B. bei älteren App-Versionen).

Aus diesem Grund bietet SQL Connect eine Entwicklungsumgebung und Tools, mit denen Sie Prototypen für Ihre auf dem Server bereitgestellten Schemas, Abfragen und Mutationen erstellen können. Außerdem werden während der Prototyperstellung automatisch clientseitige SDKs generiert.

Nachdem Sie die Updates für Ihre Dienst- und Client-Apps durchlaufen haben, können sowohl serverseitige als auch clientseitige Updates bereitgestellt werden.

Wie sieht der Workflow für die Cliententwicklung aus?

Wenn Sie die Anleitung Erste Schritte befolgt haben, haben Sie bereits einen Überblick über den allgemeinen Entwicklungsablauf für SQL Connect erhalten. 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 Schritte ausführen müssen, um generierte Web-SDKs in Ihren Client-Apps zu verwenden:

  1. Firebase zu Ihrer Web-App hinzufügen

Gehen Sie anschließend so vor:

  1. App-Schema entwickeln
  2. Clientcode mit dem JavaScript SDK initialisieren
  3. SDK-Generierung einrichten:
    • Mit der Schaltfläche SDK zur App hinzufügen in der VS Code-Erweiterung für SQL Connect
    • Durch Aktualisieren von connector.yaml für das JavaScript SDK.
  4. Bibliotheken und generierten Code mit dem JavaScript SDK importieren
  5. Aufrufe von Abfragen und Mutationen mit dem JavaScript SDK implementieren
  6. Testen, indem Sie den SQL Connect Emulator mit dem JavaScript SDK 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 SQL Connect SDKs für Frameworks.

App initialisieren

Initialisieren Sie zuerst Ihre App mit der Standardsequenz von Firebase.

initializeApp({...});

Generiertes JavaScript SDK installieren

Verwenden Sie die Firebase CLI, um SQL Connect generierte SDKs in Ihren Apps einzurichten. Der Befehl init sollte alle Apps im aktuellen Ordner erkennen und generierte SDKs automatisch installieren.

firebase init dataconnect:sdk

Verbinden Sie Ihre App mit dem SQL 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 VS Code-Erweiterung für SQL Connect installiert haben, werden generierte SDKs immer auf dem neuesten Stand gehalten.

Wenn Sie die VS Code-Erweiterung für SQL Connect nicht verwenden, können Sie generierte SDKs mit der Firebase CLI auf dem neuesten Stand halten.

firebase dataconnect:sdk:generate --watch

SDKs in Build-Pipelines generieren

Mit der Firebase CLI können Sie SQL Connect SDKs in CI/CD-Build-Prozessen generieren.

firebase dataconnect:sdk:generate

Bibliotheken importieren

Zum Initialisieren Ihres Clientcodes sind zwei Importsätze erforderlich: allgemeine SQL 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 Abfrageverweise. Sie müssen sie nur importieren und ausführen.

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 mit diesen Aktions-Shortcut-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

Weitere Informationen finden Sie unter Echtzeitupdates von SQL Connect abrufen.

Änderungen an Enumerationsfeldern verarbeiten

Das Schema einer App kann Enumerationen enthalten, auf die mit Ihren GraphQL-Abfragen zugegriffen werden kann.

Wenn sich das Design einer App ändert, können Sie neue unterstützte Enumerationswerte hinzufügen. Angenommen, Sie entscheiden sich später im Lebenszyklus Ihrer Anwendung, der Enumeration AspectRatio den Wert `FULLSCREEN` hinzuzufügen.

Im SQL 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, können ältere bereitgestellte Clients Probleme verursachen.

Beispiel für eine robuste Implementierung

Fügen Sie immer einen default Zweig zu einer switch Anweisung für die Enumerationswerte oder einen else Zweig zu einem if/else if Block hinzu, der mit den Enumerationswerten verglichen wird. Dies wird von der JavaScript-/TypeScript-Sprache nicht erzwungen, ist aber die Möglichkeit, Clientcode robust zu gestalten, falls neue Enumerationswerte 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 SQL Connect Emulator herstellen

Optional können Sie eine Verbindung zum Emulator herstellen, indem Sie connectDataConnectEmulator aufrufen und dann die SQL 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 für die Verbindung zum Emulator aus.

Clientseitiges Caching aktivieren

SQL Connect bietet eine optionale clientseitige Caching-Funktion, die Sie aktivieren können, indem Sie die Datei connector.yaml bearbeiten. Wenn diese Funktion aktiviert ist, werden Abfrageantworten von den generierten Client-SDKs lokal im Cache gespeichert. Dadurch kann die Anzahl der Datenbankanfragen Ihrer App reduziert werden und die datenbankabhängigen Teile Ihrer App funktionieren auch dann, wenn die Netzwerkverfügbarkeit unterbrochen ist.

Wenn Sie das clientseitige Caching aktivieren möchten, fügen Sie Ihrer Connector-Konfiguration eine Client-Caching-Konfiguration hinzu:

generate:
  javascriptSdk:
    outputDir: ../web/
    package: "@dataconnect/generated"
    clientCache:
      maxAge: 5s
      storage: memory

Diese Konfiguration hat zwei Parameter, die beide optional sind:

  • maxAge: Das maximale Alter einer im Cache gespeicherten Antwort, bevor das Client-SDK neue Werte abruft. Beispiele: „0“, „30s“, „1h30m“.

    Der Standardwert für maxAge ist 0. Das bedeutet, dass Antworten im Cache gespeichert werden, das Client-SDK aber immer neue Werte abruft. Die im Cache gespeicherten Werte werden nur verwendet, wenn CACHE_ONLY für executeQuery() und das erste Ergebnis angegeben wird, das von subscribe() zurückgegeben wird.

  • storage: Das Client-SDK kann so konfiguriert werden, dass Antworten entweder im persistent-Speicher oder im memory-Speicher im Cache gespeichert werden. Im persistent-Speicher im Cache gespeicherte Ergebnisse bleiben auch nach einem Neustart der App erhalten. In Web-SDKs wird nur der memory-Speicher unterstützt.

Nachdem Sie die Caching-Konfiguration Ihres Connectors aktualisiert haben, generieren Sie Ihre Client-SDKs neu und erstellen Sie Ihre App neu. Anschließend werden Antworten von executeQuery() und subscribe() im Cache gespeichert und im Cache gespeicherte Werte gemäß der konfigurierten Richtlinie verwendet. Dies geschieht in der Regel automatisch, ohne dass Sie etwas tun müssen. Beachten Sie jedoch Folgendes:

  • Das Standardverhalten von executeQuery() ist wie oben beschrieben: Wenn ein Ergebnis für eine Abfrage im Cache gespeichert ist und der im Cache gespeicherte Wert nicht älter als maxAge ist, wird der im Cache gespeicherte Wert verwendet. Dieses Standardverhalten wird als PREFER_CACHE-Richtlinie bezeichnet.

    Sie können auch für einzelne Aufrufe von executeQuery() angeben, dass entweder nur im Cache gespeicherte Werte bereitgestellt werden (CACHE_ONLY) oder dass bedingungslos neue Werte vom Server abgerufen werden (SERVER_ONLY).

    await executeQuery(queryRef, QueryFetchPolicy.CACHE_ONLY);
    
    await executeQuery(queryRef, QueryFetchPolicy.SERVER_ONLY);
    
  • Wenn Sie subscribe() aufrufen, wird immer sofort der im Cache gespeicherte Inhalt zurückgegeben, falls vorhanden, unabhängig von der Einstellung maxAge. Bei nachfolgenden Aufrufen von executeQuery() werden Listener gemäß der konfigurierten maxAge benachrichtigt.

Datentypen im SDK

Der SQL Connect Server stellt allgemeine GraphQL-Datentypen dar. Diese werden im SDK wie folgt dargestellt.

SQL Connect Typ TypeScript
Zeitstempel String
Datum String
UUID String
INT64 String
Doppelt Zahl
Float Zahl

React- und Angular-SDKs mit TanStack generieren

Firebase SQL Connect bietet ein generiertes SDK mit Hooks für React und Angular, das Bibliotheken von unseren Partnern 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.

TanStack bietet eine eigene Implementierung des clientseitigen Cachings und von Echtzeitabos, die mit der integrierten Echtzeitunterstützung von SQL Connect's zusammenarbeiten kann, aber nur mit einigen Schwierigkeiten. Wir empfehlen, entweder die TanStack-basierten Bindungen oder SQL Connect's integrierte Echtzeitunterstützung zu verwenden, aber nicht beides.

Die eigene Echtzeitimplementierung von SQL Connect's hat einige Vorteile gegenüber den TanStack-Bindungen:

  • Normalisiertes Caching: SQL Connect implementiert normalisiertes Caching, das die Datenkonsistenz sowie die Speicher- und Netzwerkeffizienz verbessert im Vergleich zum Caching auf Abfrageebene. Wenn eine Entität in einem Bereich Ihrer App aktualisiert wird, wird sie auch in anderen Bereichen aktualisiert, in denen diese Entität verwendet wird.
  • Remote-Invalidierung: SQL Connect kann im Cache gespeicherte   Entitäten auf allen abonnierten Geräten remote invalidieren.

App initialisieren

Initialisieren Sie zuerst Ihre App mit der Standardsequenz von Firebase, wie bei jeder Firebase-Web-App.

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, das bereits beschrieben wurde, werden SDKs mit den 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 einzubeziehen.

Bibliotheken importieren

Zum Initialisieren Ihres React- oder Angular Clientcodes sind vier Importsätze erforderlich: allgemeine SQL Connect Importe, allgemeine TanStack-Importe, und spezifische Importe 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";

Abfragen und Mutationen in Ihrem React- oder Angular-Client verwenden

Nachdem die Einrichtung abgeschlossen ist, können Sie Methoden aus dem generierten SDK einbinden.

Im folgenden Snippet sehen Sie die use-präfixierte Methode useListAllMovies für React und die inject-präfixierte Methode injectListAllMovies für Angular, beide aus dem generierten SDK.

Reagieren

Alle diese Vorgänge im generierten SDK, sowohl Abfragen als auch Mutationen, rufen TanStackQuery-Bindungen auf:

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 bei Datenänderungen automatisch neu geladen werden.

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 SQL Connect Emulator herstellen

Optional können Sie eine Verbindung zum Emulator herstellen, indem Sie connectDataConnectEmulator aufrufen und dann die SQL Connect Instanz an Ihren 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 für die Verbindung zum Emulator aus.

SDKs während der Prototyperstellung aktualisieren

Wenn Sie die VS Code-Erweiterung für SQL Connect installiert haben, werden generierte SDKs immer auf dem neuesten Stand gehalten.

Wenn Sie die VS Code-Erweiterung für SQL Connect nicht verwenden, können Sie generierte SDKs mit der Firebase CLI auf dem neuesten Stand halten.

firebase dataconnect:sdk:generate --watch

SDKs in Build-Pipelines generieren

Mit der Firebase CLI können Sie SQL Connect SDKs in CI/CD-Build-Prozessen generieren.

firebase dataconnect:sdk:generate