Usa gli SDK web generati

Gli SDK client Firebase Data 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 che implementi nel tuo servizio Data Connect. Poi, integra i metodi di questo SDK nella logica del client.

Come abbiamo già detto, è importante notare che Data Connect le query e le mutazioni non vengono inviate dal codice client ed eseguite sul server. Al contrario, una volta eseguito il deployment, le operazioni Data Connect vengono archiviate sul server come Cloud Functions. Ciò significa che devi implementare le modifiche lato client corrispondenti per evitare di interrompere l'esperienza degli utenti esistenti (ad esempio, nelle versioni precedenti dell'app).

Per questo motivo, Data Connect ti fornisce un ambiente di sviluppo e strumenti che ti consentono di prototipare schemi, query e mutazioni implementati sul server. Inoltre, genera automaticamente gli SDK lato client durante la prototipazione.

Una volta completati gli aggiornamenti iterativi del servizio e delle app client, gli aggiornamenti lato server e lato client sono pronti per il deployment.

Qual è il flusso di lavoro di sviluppo del cliente?

Se hai seguito la guida Inizia, hai appreso il flusso di sviluppo complessivo per Data 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 tue app client, segui questi passaggi preliminari:

  1. Aggiungi Firebase alla tua app web.

Quindi:

  1. Sviluppa lo schema dell'app.
  2. Inizializza il codice client con l'SDK JavaScript o con le librerie React o Angular.
  3. Per React e Angular, installa i pacchetti Tanstack Query.
  4. Configura la generazione dell'SDK:

    • Con il pulsante Aggiungi SDK all'app nella nostra estensione Data Connect VS Code
    • Aggiornando connector.yaml per l'SDK JavaScript o React o Angular.
  5. Importa librerie e codice generato con l'SDK JavaScript o React o Angular.

  6. Implementa le chiamate a query e mutazioni con l'SDK JavaScript, o React o Angular.

  7. Esegui il test configurando l'emulatore Data Connect con l'SDK JavaScript o React o Angular.

Implementa il codice client con l'SDK Firebase JavaScript

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

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

Inizializzare l'app

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

initializeApp({...});

Installa l'SDK JavaScript generato

Utilizza la CLI Firebase per configurare gli SDK generati da Data 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 la tua app al servizio Data 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);

Aggiornare gli SDK durante la prototipazione

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

Se non utilizzi l'estensione Data Connect VS Code, puoi utilizzare la CLI Firebase per mantenere aggiornati gli SDK generati.

firebase dataconnect:sdk:generate --watch

Genera SDK nelle pipeline di build

Puoi utilizzare la CLI Firebase per generare SDK Data Connect nei processi di build CI/CD.

firebase dataconnect:sdk:generate

Importare librerie

Per inizializzare il codice client sono necessari due set di importazioni: le importazioni generali Data Connect e le importazioni specifiche dell'SDK generate.

Prendi nota dell'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';

Utilizzare le query dell'SDK JavaScript

Il codice generato includerà già i riferimenti alle query predefiniti. Tutto ciò che devi fare è importare ed eseguire la chiamata.

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

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

Metodi di query dell'SDK di chiamata

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

Puoi iscriverti alle modifiche (che verranno aggiornate ogni volta che esegui una query).

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`

Gestire 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 enum supportati. Ad esempio, immagina che in un secondo momento del ciclo di vita della tua applicazione decidi di aggiungere un valore FULLSCREEN all'enumerazione AspectRatio.

Nel flusso di lavoro Data 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 meno recenti potrebbero non funzionare.

Esempio di implementazione resiliente

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

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

Utilizzare le mutazioni dell'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' }));

Connettersi all'emulatore Data Connect

Se vuoi, puoi connetterti all'emulatore chiamando connectDataConnectEmulator e poi passando l'istanza Data Connect, 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, commenta le righe per la connessione all'emulatore.

Implementare il codice client per React e Angular

Firebase Data Connect fornisce un SDK generato con hook per React e Angular utilizzando le librerie disponibili presso i 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.

Inizializzare l'app

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

initializeApp({...});

Installa i pacchetti Firebase di TanStack Query

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, come 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 aggiuntivi.

Importare librerie

Per inizializzare il codice client React o Angular sono necessari quattro set di importazioni: importazioni Data Connect generali, importazioni TanStack generali e importazioni specifiche per gli SDK generati per 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";

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

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

Connettersi all'emulatore Data Connect

Se vuoi, puoi connetterti all'emulatore chiamando connectDataConnectEmulator e poi passando l'istanza Data Connect 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, commenta le righe per la connessione all'emulatore.

Tipi di dati nell'SDK

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

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

Aggiornare gli SDK durante la prototipazione

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

Se non utilizzi l'estensione Data Connect VS Code, puoi utilizzare la CLI Firebase per mantenere aggiornati gli SDK generati.

firebase dataconnect:sdk:generate --watch

Genera SDK nelle pipeline di build

Puoi utilizzare la CLI Firebase per generare SDK Data Connect nei processi di build CI/CD.

firebase dataconnect:sdk:generate