Usa gli SDK web generati

Gli SDK client Firebase SQL Connect ti consentono di chiamare le query e le mutazioni lato server direttamente da un'app Firebase. Generi un SDK client personalizzato in parallelo alla progettazione degli schemi, delle query e delle mutazioni di cui esegui il deployment nel SQL Connect servizio. Poi, integri i metodi di questo SDK nella logica del client.

Come abbiamo già detto, è importante notare che SQL Connect query e mutazioni non vengono inviate dal codice client ed eseguite sul server. Quando viene eseguito il deployment, le operazioni SQL Connect vengono archiviate su il server come Cloud Functions. Ciò significa che devi eseguire il deployment delle modifiche lato client corrispondenti per evitare di interrompere l'utilizzo da parte degli utenti esistenti (ad esempio, nelle versioni precedenti dell'app).

Per questo motivo, SQL Connect ti fornisce un ambiente di sviluppo e strumenti che ti consentono di creare prototipi di schemi, query e mutazioni di cui hai eseguito il deployment sul server. Genera anche automaticamente gli SDK lato client durante la creazione del prototipo.

Una volta eseguite le iterazioni degli aggiornamenti del servizio e delle app client, gli aggiornamenti lato server e lato client sono pronti per il deployment.

Che cos'è il flusso di lavoro di sviluppo client?

Se hai seguito la guida Inizia, hai scoperto il flusso di sviluppo generale per SQL Connect. In questa guida troverai informazioni più dettagliate sulla generazione di SDK web dallo schema e sull'utilizzo di query e mutazioni client.

Per riassumere, per utilizzare gli SDK web generati nelle app client, segui questi passaggi preliminari:

  1. Aggiungi Firebase alla tua applicazione web.

Quindi:

  1. Sviluppa lo schema dell'app.
  2. Inizializza il codice client con l'SDK JavaScript.
  3. Configura la generazione dell'SDK:
    • Con il pulsante Aggiungi SDK all'app nell'estensione SQL Connect VS Code.
    • Aggiornando il tuo connector.yaml per l'SDK JavaScript.
  4. Importa le librerie e il codice generato con l'SDK JavaScript.
  5. Implementa le chiamate a query e mutazioni con l'SDK JavaScript.
  6. Esegui i test configurando l'emulatore SQL Connect con l'SDK JavaScript.

Implementa il codice client con l'SDK Firebase JavaScript

Questa sezione spiega come implementare i client utilizzando l'SDK Firebase JavaScript.

Se utilizzi React o Angular, consulta le istruzioni di configurazione alternative e i link a documentazione aggiuntiva sulla generazione di SQL Connect SDK per i framework.

Inizializza l'app

Innanzitutto, inizializza l'app utilizzando la sequenza Firebase standard.

initializeApp({...});

Installa l'SDK JavaScript generato

Utilizza l'interfaccia a riga di comando Firebase per configurare gli SDK generati da SQL Connect nelle tue app. Il comando init dovrebbe rilevare tutte le app nella cartella corrente e installare automaticamente gli SDK generati.

firebase init dataconnect:sdk

Collega l'app al servizio SQL Connect.

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);

Aggiorna gli SDK durante la creazione del prototipo

Se hai installato l'estensione SQL Connect VS Code, gli SDK generati saranno sempre aggiornati.

Se non utilizzi l'estensione SQL Connect VS Code, puoi utilizzare l'interfaccia a riga di comando di Firebase per mantenere aggiornati gli SDK generati.

firebase dataconnect:sdk:generate --watch

Genera SDK nelle pipeline di build

Puoi utilizzare l'interfaccia a riga di comando di Firebase per generare SQL Connect SDK nei processi di build CI/CD.

firebase dataconnect:sdk:generate

Importa le librerie

Sono necessari due set di importazioni per inizializzare il codice client: importazioni generali SQL Connect e importazioni specifiche di SDK generati.

Tieni presente l'oggetto ConnectorConfig incluso nelle importazioni generali.

// 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';

Utilizza le query dall'SDK JavaScript

Il codice generato include già i riferimenti alle query predefiniti. Devi solo importarli e chiamare execute.

import { executeQuery } from 'firebase/data-connect';
import { listMoviesRef } from '@dataconnect/generated';

const ref = listMoviesRef();
const { data } = await executeQuery(ref);
console.log(data.movies);

Chiama i metodi di query dell'SDK

Ecco un esempio di utilizzo di queste funzioni di scorciatoia per le azioni:

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);
}

Iscriviti alle modifiche

Consulta Ricevi aggiornamenti in tempo reale da SQL Connect.

Gestisci le modifiche ai campi di enumerazione

Lo schema di un'app può contenere enumerazioni, a cui è possibile accedere tramite le query GraphQL.

Man mano che il design di un'app cambia, puoi aggiungere nuovi valori supportati per l'enumerazione. Ad esempio, supponiamo che in un secondo momento nel ciclo di vita dell'applicazione tu decida di aggiungere un valore FULLSCREEN all'enumerazione AspectRatio.

Nel flusso di lavoro SQL Connect, puoi utilizzare gli strumenti di sviluppo locali per aggiornare le query e gli SDK.

Tuttavia, prima di rilasciare una versione aggiornata dei client, i client di cui è stato eseguito il deployment precedente potrebbero non funzionare.

Esempio di implementazione resiliente

Aggiungi sempre un ramo default a un'istruzione switch sui valori di enumerazione o un ramo else a un blocco if/else if che esegue il confronto con i valori di enumerazione. Questo non è applicato dal linguaggio JavaScript/TypeScript, ma è il modo per rendere robusto il codice client nel caso in cui vengano aggiunti nuovi valori di enumerazione.

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!");
}

Utilizza le mutazioni dall'SDK JavaScript

Le mutazioni sono accessibili allo stesso modo delle query.

import { executeMutation } from 'firebase/data-connect';
import { createMovieRef } from '@dataconnect/generated';

const { data } = await executeMutation(createMovieRef({ movie: 'Empire Strikes Back' }));

Connettiti all'emulatore SQL Connect

Se vuoi, puoi connetterti all'emulatore chiamando connectDataConnectEmulator e poi passando l'SQL Connect istanza, come segue:

import { connectDataConnectEmulator } from 'firebase/data-connect';
import { connectorConfig } from '@dataconnect/generated';

const dataConnect = getDataConnect(connectorConfig);
connectDataConnectEmulator(dataConnect, 'localhost', 9399);`

// Make calls from your app

Per passare alle risorse di produzione, inserisci un commento nelle righe per la connessione all'emulatore.

Attiva la memorizzazione nella cache lato client

SQL Connect ha una funzionalità di memorizzazione nella cache lato client facoltativa, che puoi attivare modificando il file connector.yaml. Quando questa funzionalità è attivata, gli SDK client generati memorizzano nella cache locale le risposte alle query, il che può ridurre il numero di richieste di database effettuate dall'app e consente alle parti dell'app che dipendono dal database di funzionare quando la disponibilità della rete viene interrotta.

Per attivare la memorizzazione nella cache lato client, aggiungi una configurazione di memorizzazione nella cache client alla configurazione del connettore:

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

Questa configurazione ha due parametri, entrambi facoltativi:

  • maxAge: l'età massima di una risposta memorizzata nella cache prima che l'SDK client recuperi nuovi valori. Esempi: "0", "30s", "1h30m".

    Il valore predefinito di maxAge è 0, il che significa che le risposte vengono memorizzate nella cache, ma l'SDK client recupererà sempre nuovi valori. I valori memorizzati nella cache verranno utilizzati solo quando CACHE_ONLY viene specificato per executeQuery() e il risultato iniziale restituito da subscribe().

  • storage: l'SDK client può essere configurato per memorizzare nella cache le risposte in persistent storage o in memory. I risultati memorizzati nella cache in persistent storage verranno mantenuti dopo il riavvio dell'app. Negli SDK web è supportato solo memory storage.

Dopo aver aggiornato la configurazione della memorizzazione nella cache del connettore, rigenera gli SDK client e ricompila l'app. Una volta fatto, executeQuery() e subscribe() memorizzeranno nella cache le risposte e utilizzeranno i valori memorizzati nella cache in base alla policy configurata. In genere, questa operazione viene eseguita automaticamente, senza ulteriori interventi da parte tua. Tuttavia, tieni presente quanto segue:

  • Il comportamento predefinito di executeQuery() è quello descritto sopra: se un risultato viene memorizzato nella cache per una query e il valore memorizzato nella cache non è più vecchio di maxAge, utilizza il valore memorizzato nella cache. Questo comportamento predefinito è chiamato policy PREFER_CACHE.

    Puoi anche specificare le singole chiamate a executeQuery() per pubblicare solo i valori memorizzati nella cache (CACHE_ONLY) o per recuperare in modo incondizionato nuovi valori dal server (SERVER_ONLY).

    await executeQuery(queryRef, QueryFetchPolicy.CACHE_ONLY);
    
    await executeQuery(queryRef, QueryFetchPolicy.SERVER_ONLY);
    
  • Quando chiami subscribe(), restituirà sempre immediatamente i contenuti memorizzati nella cache, se esistenti, indipendentemente dall'impostazione maxAge. Le chiamate successive a executeQuery() invieranno una notifica ai listener in base al valore maxAge configurato.

Tipi di dati nell'SDK

Il server SQL Connect rappresenta i tipi di dati GraphQL comuni. Questi sono rappresentati nell'SDK come segue.

Tipo di SQL Connect TypeScript
Timestamp stringa
Data stringa
UUID stringa
Int64 stringa
Doppio Numero
In virgola mobile Numero

Genera SDK React e Angular con TanStack

Firebase SQL Connect fornisce un SDK generato con hook per React e Angular utilizzando le librerie disponibili dai nostri partner di Invertase, TanStack Query Firebase.

Questa libreria fornisce un insieme di hook che semplificano notevolmente la gestione delle attività asincrone con Firebase nelle tue applicazioni.

TanStack include una propria implementazione della memorizzazione nella cache lato client e degli abbonamenti in tempo reale, che può funzionare insieme al supporto in tempo reale integrato di SQL Connect', ma solo con alcune difficoltà. Ti consigliamo di utilizzare i binding basati su TanStack o SQL Connect's il supporto in tempo reale integrato, ma non entrambi.

Tieni presente che l'implementazione in tempo reale di SQL Connect's presenta alcuni vantaggi rispetto ai binding TanStack:

  • Memorizzazione nella cache normalizzata: SQL Connect implementa la memorizzazione nella cache normalizzata, che migliora la coerenza dei dati, nonché l'efficienza della memoria e della rete rispetto alla memorizzazione nella cache a livello di query. Con la memorizzazione nella cache normalizzata, se un'entità viene aggiornata in un'area dell'app, verrà aggiornata anche in altre aree che utilizzano l'entità.
  • Invalidazione remota: SQL Connect può invalidare da remoto le entità memorizzate nella cache su tutti i dispositivi abbonati.

Inizializza l'app

Innanzitutto, come per qualsiasi app web Firebase, inizializza l'app utilizzando la sequenza Firebase standard.

initializeApp({...});

Installa i pacchetti TanStack Query Firebase

Installa i pacchetti per TanStack Query nel tuo progetto.

React

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

Genera l'SDK React o Angular

Come per l'SDK web standard, descritto in precedenza, gli strumenti Firebase gestiscono la generazione automatica degli SDK in base allo schema e alle operazioni.

Se hai appena aggiunto React o Angular al tuo progetto, esegui di nuovo firebase init dataconnect:sdk per riconfigurare gli SDK generati in modo da includere i binding del framework aggiuntivo.

Importa le librerie

Sono necessari quattro set di importazioni per inizializzare il codice client React o Angular: importazioni generali SQL Connect, importazioni generali di TanStack, e importazioni specifiche per gli SDK generati JS e React.

Tieni presente il tipo ConnectorConfig incluso nelle importazioni generali.

React

// 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";

Utilizza query e mutazioni nel client React o Angular

Una volta completata la configurazione, puoi incorporare i metodi dell'SDK generato.

Nello snippet seguente, nota il metodo con prefisso use useListAllMovies per React e il metodo con prefisso inject injectListAllMovies per Angular, entrambi dall'SDK generato.

React

Tutte queste operazioni nell'SDK generato, sia query che mutazioni, chiamano i binding TanStackQuery:

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;
  })
]

Utilizza le query di ricaricamento automatico con React e Angular

Puoi configurare le query in modo che vengano ricaricate automaticamente quando i dati cambiano.

React

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

Connettiti all'emulatore SQL Connect

Se vuoi, puoi connetterti all'emulatore chiamando connectDataConnectEmulator e poi passando l'SQL Connect istanza all'hook generato, come segue:

React

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;
}),

Per passare alle risorse di produzione, inserisci un commento nelle righe per la connessione all'emulatore.

Aggiorna gli SDK durante la creazione del prototipo

Se hai installato l'estensione SQL Connect VS Code, gli SDK generati saranno sempre aggiornati.

Se non utilizzi l'estensione SQL Connect VS Code, puoi utilizzare l'interfaccia a riga di comando di Firebase per mantenere aggiornati gli SDK generati.

firebase dataconnect:sdk:generate --watch

Genera SDK nelle pipeline di build

Puoi utilizzare l'interfaccia a riga di comando di Firebase per generare SQL Connect SDK nei processi di build CI/CD.

firebase dataconnect:sdk:generate