Personalizzare le dipendenze di autenticazione

La struttura modulare dell'SDK Firebase JS offre un maggiore controllo sulle come è creata la tua app. Questa flessibilità ti consente di personalizzare le dipendenze per la tua piattaforma e ottimizza le dimensioni dei bundle eliminando le funzionalità che non ti servono.

Esistono due modi per inizializzare la libreria Auth: la funzione getAuth() e la funzione initializeAuth(). Il primo, getAuth(), fornisce tutto quanto serve alla tua app per sfruttare tutte le funzionalità della libreria Auth. Lo svantaggio è che estrae molto codice che potenzialmente inutilizzati dalla tua app. Potrebbe anche eseguire il pull in codice che non è semplicemente supportato alla piattaforma scelta come target, generando errori. Per evitare questi problemi, puoi usa initializeAuth(), che accetta una mappa delle dipendenze. getAuth() chiama semplicemente initializeAuth() con tutte le dipendenze specificate. Per spiegarci, ecco l'equivalente di getAuth() negli ambienti browser:

import {initializeAuth, browserLocalPersistence, browserPopupRedirectResolver, browserSessionPersistence, indexedDBLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";

const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
  persistence: [indexedDBLocalPersistence, browserLocalPersistence, browserSessionPersistence],
  popupRedirectResolver: browserPopupRedirectResolver,
});

Personalizza le dipendenze

Non tutte le app utilizzano la famiglia signInWithPopup o signInWithRedirect di funzioni. Molte app non hanno bisogno della flessibilità offerta da indexedDB, oppure non avrà bisogno della possibilità di supportare sia indexedDB sia localStorage nel caso non sarà disponibile. In questi casi, il valore getAuth() predefinito include molti codice inutilizzato che aumenta le dimensioni dei bundle senza motivo. Queste app possono invece personalizzare le proprie dipendenze. Ad esempio, se la tua app utilizza solo l'indirizzo email e localStorage sia sufficiente (poiché non stai utilizzando script dei service worker), puoi eliminare molti sovraccarichi di codice inizializzando Auth nel seguente modo:

import {initializeAuth, browserLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";

const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
  persistence: browserLocalPersistence,
  // No popupRedirectResolver defined
});

Con questo codice, hai rimosso tre dipendenze grandi che la tua app non riducendo significativamente la quantità di larghezza di banda utilizzata dagli utenti quando visitano il tuo sito.

Considerazioni specifiche per la piattaforma

In molti casi, devi definire manualmente le dipendenze di Auth per evitare errori all'inizializzazione. La funzione getAuth() presuppone una piattaforma specifica. Per il punto di ingresso predefinito, ovvero l'ambiente del browser e per Il punto di accesso a Cordova è l'ambiente circostante. Ma a volte, però, le esigenze la tua applicazione specifica con queste ipotesi. Ad esempio, per gli script worker web e di servizio, l'implementazione predefinita di getAuth() importa codice che legge dall'oggetto window, causando errori. In quelle in ogni caso, è necessario personalizzare le dipendenze. Il seguente codice è appropriato per inizializzare la libreria Auth in un contesto di service worker:

import {initializeAuth, indexedDBLocalPersistence} from "firebase/auth";
import {initializeApp} from "firebase/app";

const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
  persistence: indexedDBLocalPersistence,
  // No popupRedirectResolver defined
});

Questo codice indica ad Auth di inizializzarsi con la persistenza indexedDB, ovvero disponibile nei contesti dei worker) e omette la dipendenza popupRedirectResolver, che presuppone la disponibilità di un contesto DOM.

Esistono altri motivi per cui potresti definire manualmente le dipendenze su determinate piattaforme. Se definisci il campo popupRedirectResolver nell'inizializzazione dell'autenticazione, in alcuni casi la libreria eseguirà altre attività sull'inizializzazione. Nei browser mobile, la libreria aprirà automaticamente un iframe per il tuo dominio Auth. Ciò avviene per semplificare l'esperienza alla maggior parte per gli utenti, ma può influire sulle prestazioni caricando codice aggiuntivo . Questo comportamento può essere evitato utilizzando initializeAuth() e passando manualmente la dipendenza browserPopupRedirectResolver alle funzioni che ne hanno bisogno:

import {initializeAuth, browserLocalPersistence, browserPopupRedirectResolver, indexedDBLocalPersistence, signInWithRedirect, GoogleAuthProvider} from "firebase/auth";
import {initializeApp} from "firebase/app";

const app = initializeApp({/** Your app config */});
const auth = initializeAuth(app, {
  persistence: [indexedDBLocalPersistence, browserLocalPersistence],
});

// Later
signInWithRedirect(auth, new GoogleAuthProvider(), browserPopupRedirectResolver);

Se avessimo fornito browserPopupRedirectResolver nelle dipendenze di initializeAuth(), il terzo parametro nella chiamata a signInWithRedirect() non sarebbe stato necessario. Tuttavia, spostando questa dipendenza direttamente sulla chiamata a signInWithRedirect(), l'impatto iniziale sul rendimento durante l'inizializzazione viene rimosso. Lo spostamento della dipendenza comporta dei compromessi, ma la parte importante è che puoi prendere decisioni in merito inizializzando manualmente la libreria.

Quando utilizzare l'inizializzazione personalizzata

Per riepilogare, l'inizializzazione personalizzata ti offre un controllo molto maggiore sull'utilizzo dell'SDK Auth da parte della tua app. La funzione getAuth() standard è un buon punto di partenza e soddisfa la maggior parte dei casi d'uso. Per la maggior parte delle app, getAuth() potrebbe essere tutto ciò di cui hai bisogno. Ma ci sono molti motivi per cui potresti voler (o avere) bisogno di passare alla modalità manuale gestione delle dipendenze:

  • Per le app in cui le dimensioni del bundle e i tempi di caricamento sono estremamente importanti, l'inizializzazione dell'autenticazione personalizzata può potenzialmente ridurre molti kilobyte di dati. Inoltre, consente di ridurre i tempi di caricamento iniziali spostando le dipendenze al momento dell'utilizzo anziché al momento dell'inizializzazione.
  • Per il codice eseguito in contesti non DOM (come web e service worker), initializeAuth() deve essere utilizzato per evitare errori.