Das modulare Design des Firebase JS SDK gibt Ihnen viel mehr Kontrolle wie Ihre App aufgebaut ist. So können Sie Ihre Abhängigkeiten an Ihre Plattform anpassen und die Größe Ihres Bundles optimieren, indem Sie nicht benötigte Funktionen entfernen.
Es gibt zwei Möglichkeiten, die Auth-Bibliothek zu initialisieren: die Funktion getAuth()
und
die Funktion initializeAuth()
. Die erste, getAuth()
, liefert alles,
Ihre App benötigt, um alle Funktionen der Auth-Bibliothek nutzen zu können
zu bieten. Der Nachteil ist, dass es viel Code
abruft, der möglicherweise
nicht von Ihrer App verwendet werden. Es kann auch Code übernehmen, der auf dem
verwendet wird, was zu Fehlern führt. Um diese Probleme zu vermeiden,
Verwenden Sie initializeAuth()
, wodurch eine Map der Abhängigkeiten erstellt wird. Das getAuth()
ruft einfach initializeAuth()
mit allen angegebenen Abhängigkeiten auf.
Zur Veranschaulichung: Das entspricht getAuth()
in Browserumgebungen:
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,
});
Abhängigkeiten anpassen
Nicht alle Apps nutzen die signInWithPopup
- oder signInWithRedirect
-Familie
Funktionen. Viele Apps benötigen nicht die Flexibilität von indexedDB
oder die Möglichkeit, sowohl indexedDB
als auch localStorage
zu unterstützen, falls eine der beiden Optionen nicht verfügbar ist. In diesen Fällen enthält das standardmäßige getAuth()
viel ungenutzten Code, der die Bundle-Größe ohne Grund erhöht. Stattdessen können diese Apps
ihre Abhängigkeiten anzupassen. Wenn Ihre App beispielsweise nur die E-Mail-Link-Authentifizierung verwendet und localStorage ausreicht (weil Sie keine Web- oder Service Worker-Scripts verwenden), können Sie viel Code entfernen, indem Sie die Authentifizierung so initialisieren:
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
});
Mit diesem Code haben Sie drei große Abhängigkeiten entfernt, die Ihre App nicht benötigt. Dadurch wird die Bandbreite, die Ihre Nutzer beim Besuch Ihrer Website verbrauchen, erheblich reduziert.
Plattformspezifische Überlegungen
In vielen Fällen müssen Sie die Authentifizierungsabhängigkeiten manuell definieren, um Fehler bei der Initialisierung zu vermeiden. Die Funktion getAuth()
geht davon aus,
Plattform. Für den Standardeinstiegspunkt ist das eine Browserumgebung und für den Cordova-Einstiegspunkt eine Cordova-Umgebung. Manchmal stehen die Anforderungen Ihrer spezifischen Anwendung jedoch im Widerspruch zu diesen Annahmen. Für Web und Service
Worker-Skripts wie z. B. die standardmäßige getAuth()
-Implementierung
Code, der aus dem window
-Objekt liest, was zu Fehlern führt. In diesen Fällen müssen Sie Ihre Abhängigkeiten anpassen. Mit dem folgenden Code wird die Auth-Bibliothek in einem Service Worker-Kontext initialisiert:
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
});
In diesem Code wird Auth angewiesen, mit indexedDB
-Persistenz zu initialisieren (die in Worker-Kontexten verfügbar ist). Die Abhängigkeit von popupRedirectResolver
wird weggelassen, da davon ausgegangen wird, dass ein DOM-Kontext verfügbar ist.
Es gibt noch weitere Gründe, warum Sie Abhängigkeiten für bestimmte Plattformen manuell definieren können. Durch die Definition des Felds popupRedirectResolver
bei der Auth-Initialisierung
in einigen Fällen führt die Bibliothek zusätzliche Schritte bei der Initialisierung aus. In mobilen Browsern öffnet die Bibliothek automatisch einen Iframe zu Ihrer Authentifizierungsdomain. Das soll die Nutzung für die meisten Nutzer reibungslos gestalten. Es kann jedoch zu Leistungseinbußen kommen, da beim Starten der App zusätzlicher Code geladen wird. Dieses Verhalten lässt sich vermeiden, indem Sie initializeAuth()
verwenden und die browserPopupRedirectResolver
-Abhängigkeit manuell an die Funktionen übergeben, die sie benötigen:
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);
Hätten wir browserPopupRedirectResolver
in den Abhängigkeiten zu initializeAuth()
angegeben, wäre der dritte Parameter im Aufruf von signInWithRedirect()
nicht erforderlich gewesen. Wenn Sie diese Abhängigkeit jedoch direkt auf den Aufruf von signInWithRedirect()
verschieben, wird der anfängliche Leistungseinbruch während der Initialisierung beseitigt. Das Verschieben der Abhängigkeit hat Vor- und Nachteile. Wichtig ist jedoch, dass Sie Entscheidungen zu diesen Vor- und Nachteilen treffen können, indem Sie die Bibliothek manuell initialisieren.
Wann die benutzerdefinierte Initialisierung verwendet werden sollte
Zusammenfassend lässt sich sagen, dass Sie mit der benutzerdefinierten Initialisierung die Verwendung des Auth SDK durch Ihre App viel besser steuern können. Mit der Standardfunktion getAuth()
können Sie
und ist für die meisten
Anwendungsfälle geeignet. Bei den meisten Apps ist getAuth()
möglicherweise nur du
die Sie brauchen. Es gibt jedoch viele Gründe, warum Sie zur manuellen Abhängigkeitsverwaltung wechseln möchten (oder müssen):
- Bei Apps, bei denen die Größe des Bundles und die Ladezeiten extrem wichtig sind, kann die benutzerdefinierte Authentifizierungsinitialisierung potenziell viele Kilobyte an Daten einsparen. Außerdem können Sie die anfänglichen Ladezeiten verkürzen, indem Sie Abhängigkeiten auf den Zeitpunkt der Verwendung statt auf den Zeitpunkt der Initialisierung verschieben.
- Für Code, der in nicht DOM-Kontexten ausgeführt wird (z. B. Web- und Dienst-Worker), muss
initializeAuth()
verwendet werden, um Fehler zu vermeiden.