1. Prima di iniziare
L'SDK modulare Firebase JS è una riscrittura dell'SDK JS esistente e verrà rilasciato come prossima versione principale. Consente agli sviluppatori di escludere il codice inutilizzato dall'SDK Firebase JS per creare bundle più piccoli e ottenere prestazioni migliori.
La differenza più evidente nell'SDK JS modulare è che le funzionalità sono ora organizzate in funzioni mobili che importerai, anziché in un unico spazio dei nomi firebase
che include tutto. Questo nuovo modo di organizzare il codice è ciò che consente lo scuotimento degli alberi e imparerai come aggiornare qualsiasi app che attualmente utilizza l'SDK Firebase JS v8 a quello modulare.
Per garantire un processo di aggiornamento fluido, viene fornita una serie di pacchetti di compatibilità. In questo codelab imparerai come utilizzare i pacchetti di compatibilità per trasferire l'app pezzo per pezzo.
Cosa costruirai
In questo codelab, migrerai gradualmente un'app Web esistente per la lista di titoli azionari che utilizza l'SDK JS v8 al nuovo SDK JS modulare in tre fasi:
- Aggiorna l'app per utilizzare i pacchetti di compatibilità
- Aggiorna l'app dai pacchetti di compatibilità all'API modulare pezzo per pezzo
- Utilizza Firestore Lite, un'implementazione leggera dell'SDK Firestore, per migliorare ulteriormente le prestazioni dell'app
Questo codelab è incentrato sull'aggiornamento dell'SDK Firebase. Altri concetti e blocchi di codice vengono ignorati e possono essere semplicemente copiati e incollati.
Di cosa avrai bisogno
2. Preparati
Ottieni il codice
Tutto ciò di cui hai bisogno per questo progetto risiede in un repository Git. Per iniziare, dovrai prendere il codice e aprirlo nel tuo ambiente di sviluppo preferito.
Clona il repository Github del codelab dalla riga di comando:
git clone https://github.com/FirebaseExtended/codelab-modular-sdk.git
In alternativa, se non hai git installato, puoi scaricare il repository come file ZIP e decomprimere il file zip scaricato.
Importa l'app
- Utilizzando il tuo IDE, apri o importa la directory
codelab-modular-sdk
. - Esegui
npm install
per installare le dipendenze necessarie per creare ed eseguire l'app localmente. - Esegui
npm run build
per creare l'app. - Esegui
npm run serve
per avviare il server web - Aprire una scheda del browser su http://localhost:8080
3. Stabilire una linea di base
Qual è il tuo punto di partenza?
Il punto di partenza è un'app watchlist di azioni progettata per questo codelab. Il codice è stato semplificato per illustrare i concetti di questo codelab e prevede una gestione degli errori ridotta. Se scegli di riutilizzare parte di questo codice in un'app di produzione, assicurati di gestire eventuali errori e di testare completamente tutto il codice.
Assicurati che tutto funzioni nell'app:
- Accedi in modo anonimo utilizzando il pulsante di accesso nell'angolo in alto a destra.
- Dopo aver effettuato l'accesso, cerca e aggiungi "NFLX", "SBUX" e "T" alla watchlist facendo clic sul pulsante Aggiungi , digitando le lettere e facendo clic sulla riga dei risultati di ricerca che viene visualizzata di seguito.
- Rimuovere un titolo dalla watchlist facendo clic sulla x alla fine della riga.
- Guarda gli aggiornamenti in tempo reale del prezzo delle azioni.
- Apri Chrome DevTools, vai alla scheda Rete e seleziona Disabilita cache e Utilizza righe di richiesta di grandi dimensioni . Disabilita cache assicura che vengano sempre visualizzate le modifiche più recenti dopo un aggiornamento e Usa righe di richiesta di grandi dimensioni fa sì che la riga visualizzi sia la dimensione trasmessa che la dimensione della risorsa per una risorsa. In questo codelab siamo interessati principalmente alla dimensione di
main.js
.
- Carica l'app in diverse condizioni di rete utilizzando la limitazione simulata. Utilizzerai Slow 3G per misurare il tempo di caricamento in questo codelab perché è qui che una dimensione del bundle più piccola aiuta di più.
Ora entra e inizia a migrare l'app alla nuova API modulare.
4. Utilizzare i pacchetti di compatibilità
I pacchetti di compatibilità ti consentono di eseguire l'aggiornamento alla nuova versione dell'SDK senza modificare tutto il codice Firebase contemporaneamente. Puoi aggiornarli gradualmente all'API modulare.
In questo passaggio, aggiornerai la libreria Firebase dalla v8 alla nuova versione e modificherai il codice per utilizzare i pacchetti di compatibilità. Nei passaggi seguenti imparerai come aggiornare solo il codice di autenticazione Firebase per utilizzare prima l'API modulare, quindi aggiornare il codice Firestore.
Alla fine di ogni passaggio, dovresti essere in grado di compilare ed eseguire l'app senza interruzioni e notare una diminuzione delle dimensioni del bundle durante la migrazione di ciascun prodotto.
Ottieni il nuovo SDK
Trova la sezione delle dipendenze nel package.json
e sostituiscila con quanto segue:
pacchetto.json
"dependencies": {
"firebase": "^9.0.0"
}
Reinstallare le dipendenze
Poiché abbiamo modificato la versione della dipendenza, dobbiamo eseguire nuovamente npm install
per ottenere la nuova versione della dipendenza.
Modifica i percorsi di importazione
I pacchetti di compatibilità sono esposti nel sottomodulo firebase/compat
, quindi aggiorneremo di conseguenza i percorsi di importazione:
- Vai al file
src/firebase.ts
- Sostituisci le importazioni esistenti con le seguenti importazioni:
src/firebase.ts
import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';
Verifica che l'app funzioni
- Esegui
npm run build
per ricostruire l'app. - Apri una scheda del browser su http://localhost:8080 o aggiorna la scheda esistente.
- Gioca con l'app. Dovrebbe funzionare ancora tutto.
5. Aggiorna Auth per utilizzare l'API modulare
Puoi aggiornare i prodotti Firebase in qualsiasi ordine. In questo codelab aggiornerai prima Auth per apprendere i concetti di base perché l'API Auth è relativamente semplice. L'aggiornamento di Firestore è un po' più complicato e imparerai come farlo in seguito.
Aggiorna l'inizializzazione dell'autenticazione
- Vai al file
src/firebase.ts
- Aggiungi la seguente importazione:
src/firebase.ts
import { initializeAuth, indexedDBLocalPersistence } from 'firebase/auth';
- Elimina
import 'firebase/compat/auth'.
- Sostituisci
export const firebaseAuth = app.auth();
con:
src/firebase.ts
export const firebaseAuth = initializeAuth(app, { persistence: [indexedDBLocalPersistence] });
- Rimuovi
export type User = firebase.User;
alla fine del fascicolo.User
verrà esportato direttamente insrc/auth.ts
che modificherai successivamente.
Aggiorna il codice di autenticazione
- Vai al file
src/auth.ts
- Aggiungi le seguenti importazioni all'inizio del file:
src/auth.ts
import {
signInAnonymously,
signOut,
onAuthStateChanged,
User
} from 'firebase/auth';
- Rimuovi
User
import { firebaseAuth, User } from './firebase';
poiché hai già importatoUser
da'firebase/auth'.
- Aggiorna le funzioni per utilizzare l'API modulare.
Come hai già visto in precedenza quando abbiamo aggiornato l'istruzione import, i pacchetti nella versione 9 sono organizzati attorno a funzioni che puoi importare, a differenza delle API della versione 8 che sono basate su uno spazio dei nomi e un modello di servizio concatenati. È questa nuova organizzazione del codice che consente lo scuotimento del codice inutilizzato, poiché consente agli strumenti di creazione di analizzare quale codice viene utilizzato e cosa no.
Nella versione 9, i servizi vengono passati come primo argomento alle funzioni. I servizi sono gli oggetti che ottieni dall'inizializzazione di un servizio Firebase, ad esempio l'oggetto restituito da getAuth()
o initializeAuth()
. Mantengono lo stato di un particolare servizio Firebase e la funzione utilizza lo stato per eseguire le proprie attività. Applichiamo questo modello per implementare le seguenti funzioni:
src/auth.ts
export function firebaseSignInAnonymously() {
return signInAnonymously(firebaseAuth);
}
export function firebaseSignOut() {
return signOut(firebaseAuth);
}
export function onUserChange(callback: (user: User | null) => void) {
return onAuthStateChanged(firebaseAuth, callback);
}
export { User } from 'firebase/auth';
Verifica che l'app funzioni
- Esegui
npm run build
per ricostruire l'app. - Apri una scheda del browser su http://localhost:8080 o aggiorna la scheda esistente
- Gioca con l'app. Dovrebbe funzionare ancora tutto.
Controlla la dimensione del pacchetto
- Apri Chrome DevTools.
- Passa alla scheda Rete .
- Aggiorna la pagina per acquisire le richieste di rete.
- Cerca main.js e controlla le sue dimensioni. Hai ridotto la dimensione del bundle di 100 KB (36 KB con gzip), ovvero circa il 22% in meno modificando solo poche righe di codice! Inoltre, il sito si carica 0,75 più velocemente con una connessione 3G lenta.
6. Aggiorna l'app Firebase e Firestore per utilizzare l'API modulare
Aggiorna l'inizializzazione di Firebase
- Vai al file
src/firebase.ts.
- Sostituisci
import firebase from 'firebase/compat/app';
con:
src/firebase.ts
import { initializeApp } from 'firebase/app';
- Sostituisci
const app = firebase.initializeApp({...});
con:
src/firebase.ts
const app = initializeApp({
apiKey: "AIzaSyBnRKitQGBX0u8k4COtDTILYxCJuMf7xzE",
authDomain: "exchange-rates-adcf6.firebaseapp.com",
databaseURL: "https://exchange-rates-adcf6.firebaseio.com",
projectId: "exchange-rates-adcf6",
storageBucket: "exchange-rates-adcf6.appspot.com",
messagingSenderId: "875614679042",
appId: "1:875614679042:web:5813c3e70a33e91ba0371b"
});
Aggiorna l'inizializzazione di Firestore
- Nello stesso file
src/firebase.ts,
sostituisciimport 'firebase/compat/firestore';
con
src/firebase.ts
import { getFirestore } from 'firebase/firestore';
- Sostituisci
export const firestore = app.firestore();
con:
src/firebase.ts
export const firestore = getFirestore();
- Rimuovi tutte le righe dopo "
export const firestore = ...
"
Aggiorna le importazioni
- Apri il file
src/services.ts.
- Rimuovere
FirestoreFieldPath
,FirestoreFieldValue
eQuerySnapshot
dall'importazione. L'importazione da'./firebase'
ora dovrebbe assomigliare alla seguente:
src/services.ts
import { firestore } from './firebase';
- Importa le funzioni e i tipi che utilizzerai nella parte superiore del file:
**src/services.ts**
import {
collection,
getDocs,
doc,
setDoc,
arrayUnion,
arrayRemove,
onSnapshot,
query,
where,
documentId,
QuerySnapshot
} from 'firebase/firestore';
Aggiorna ricerca()
- Crea un riferimento alla raccolta che contiene tutti i ticker:
src/services.ts
const tickersCollRef = collection(firestore, 'current');
- Utilizza
getDocs()
per recuperare tutti i documenti dalla raccolta:
src/services.ts
const tickers = await getDocs(tickersCollRef);
Vedi search()
per il codice finito.
Aggiorna addToWatchList()
Utilizza doc()
per creare un riferimento al documento alla watchlist dell'utente, quindi aggiungi un ticker utilizzando setDoc()
con arrayUnion()
:
src/services.ts
export function addToWatchList(ticker: string, user: User) {
const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
return setDoc(watchlistRef, {
tickers: arrayUnion(ticker)
}, { merge: true });
}
Aggiorna deleteFromWatchList()
Allo stesso modo, rimuovi un ticker dalla watchlist dell'utente utilizzando setDoc()
con arrayRemove()
:
src/services.ts
export function deleteFromWatchList(ticker: string, user: User) {
const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
return setDoc(watchlistRef, {
tickers: arrayRemove(ticker)
}, { merge: true });
}
Aggiorna iscriviti a TickerChanges()
- Utilizza
doc()
per creare prima un riferimento al documento alla watchlist dell'utente, quindi ascolta le modifiche alla watchlist utilizzandoonSnapshot()
:
src/services.ts
const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
const unsubscribe = onSnapshot(watchlistRef, snapshot => {
/* subscribe to ticker price changes */
});
- Una volta che hai i ticker nella watchlist, usa
query()
per creare una query per recuperare i loro prezzi e usaonSnapshot()
per ascoltare le loro variazioni di prezzo:
src/services.ts
const priceQuery = query(
collection(firestore, 'current'),
where(documentId(), 'in', tickers)
);
unsubscribePrevTickerChanges = onSnapshot(priceQuery, snapshot => {
if (firstload) {
performance && performance.measure("initial-data-load");
firstload = false;
logPerformance();
}
const stocks = formatSDKStocks(snapshot);
callback(stocks);
});
Vedi SubscribeToTickerChanges() per l'implementazione completa.
Aggiorna iscriviti a AllTickerChanges()
Per prima cosa utilizzerai collection()
per creare un riferimento alla raccolta che contiene i prezzi per tutti i ticker, quindi utilizzerai onSnapshot()
per ascoltare le variazioni di prezzo:
src/services.ts
export function subscribeToAllTickerChanges(callback: TickerChangesCallBack) {
const tickersCollRef = collection(firestore, 'current');
return onSnapshot(tickersCollRef, snapshot => {
if (firstload) {
performance && performance.measure("initial-data-load");
firstload = false;
logPerformance();
}
const stocks = formatSDKStocks(snapshot);
callback(stocks);
});
}
Verifica che l'app funzioni
- Esegui
npm run build
per ricostruire l'app. - Apri una scheda del browser su http://localhost:8080 o aggiorna la scheda esistente
- Gioca con l'app. Dovrebbe funzionare ancora tutto.
Controlla la dimensione del pacchetto
- Apri Chrome DevTools.
- Passa alla scheda Rete .
- Aggiorna la pagina per acquisire le richieste di rete.
- Cerca
main.js
e controlla le sue dimensioni. Confrontalo nuovamente con la dimensione del pacchetto originale: abbiamo ridotto la dimensione del pacchetto di oltre 200 KB (63,8 KB con gzip) o più piccola del 50%, il che si traduce in un tempo di caricamento più veloce di 1,3 secondi!
7. Utilizza Firestore Lite per accelerare il rendering della pagina iniziale
Cos'è Firestore Lite?
L'SDK Firestore offre caching complesso, streaming in tempo reale, archiviazione persistente, sincronizzazione offline multi-scheda, tentativi, concorrenza ottimistica e molto altro ancora, e quindi ha dimensioni piuttosto grandi. Ma potresti semplicemente voler ottenere i dati una volta, senza bisogno di alcuna funzionalità avanzata. Per questi casi, Firestore ha creato una soluzione semplice e leggera, un pacchetto completamente nuovo: Firestore Lite.
Un ottimo caso d'uso per Firestore Lite è l'ottimizzazione delle prestazioni del rendering della pagina iniziale, in cui è sufficiente sapere se un utente ha effettuato o meno l'accesso, quindi leggere alcuni dati da Firetore per visualizzarli.
In questo passaggio imparerai come utilizzare Firestore lite per ridurre le dimensioni del pacchetto per accelerare il rendering della pagina iniziale, quindi caricare dinamicamente l'SDK principale di Firestore per iscriverti agli aggiornamenti in tempo reale.
Effettuerai il refactoring del codice in:
- Sposta i servizi in tempo reale in un file separato, in modo che possano essere caricati dinamicamente utilizzando l'importazione dinamica.
- Crea nuove funzioni per utilizzare Firestore Lite per recuperare watchlist e prezzi delle azioni.
- Utilizza le nuove funzioni Firestore Lite per recuperare i dati per effettuare il rendering della pagina iniziale, quindi caricare dinamicamente i servizi in tempo reale per ascoltare gli aggiornamenti in tempo reale.
Sposta i servizi in tempo reale in un nuovo file
- Crea un nuovo file chiamato
src/services.realtime.ts.
- Sposta le funzioni
subscribeToTickerChanges()
esubscribeToAllTickerChanges()
dasrc/services.ts
nel nuovo file. - Aggiungi le importazioni necessarie all'inizio del nuovo file.
Devi ancora apportare un paio di modifiche qui:
- Innanzitutto, crea un'istanza Firestore dall'SDK Firestore principale nella parte superiore del file da utilizzare nelle funzioni. Non puoi importare l'istanza Firestore da
firebase.ts
qui perché la modificherai in un'istanza Firestore Lite in pochi passaggi, che verrà utilizzata solo per il rendering della pagina iniziale. - In secondo luogo, eliminare la variabile
firstload
e il blocco if da essa protetto. Le loro funzionalità verranno spostate in nuove funzioni che creerai nel passaggio successivo.
src/services.realtime.ts
import { User } from './auth'
import { TickerChange } from './models';
import { collection, doc, onSnapshot, query, where, documentId, getFirestore } from 'firebase/firestore';
import { formatSDKStocks } from './services';
const firestore = getFirestore();
type TickerChangesCallBack = (changes: TickerChange[]) => void
export function subscribeToTickerChanges(user: User, callback: TickerChangesCallBack) {
let unsubscribePrevTickerChanges: () => void;
// Subscribe to watchlist changes. We will get an update whenever a ticker is added/deleted to the watchlist
const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
const unsubscribe = onSnapshot(watchlistRef, snapshot => {
const doc = snapshot.data();
const tickers = doc ? doc.tickers : [];
if (unsubscribePrevTickerChanges) {
unsubscribePrevTickerChanges();
}
if (tickers.length === 0) {
callback([]);
} else {
// Query to get current price for tickers in the watchlist
const priceQuery = query(
collection(firestore, 'current'),
where(documentId(), 'in', tickers)
);
// Subscribe to price changes for tickers in the watchlist
unsubscribePrevTickerChanges = onSnapshot(priceQuery, snapshot => {
const stocks = formatSDKStocks(snapshot);
callback(stocks);
});
}
});
return () => {
if (unsubscribePrevTickerChanges) {
unsubscribePrevTickerChanges();
}
unsubscribe();
};
}
export function subscribeToAllTickerChanges(callback: TickerChangesCallBack) {
const tickersCollRef = collection(firestore, 'current');
return onSnapshot(tickersCollRef, snapshot => {
const stocks = formatSDKStocks(snapshot);
callback(stocks);
});
}
Utilizza Firestore lite per recuperare i dati
- Apri
src/services.ts.
- Cambia il percorso di importazione da
'firebase/firestore'
a'firebase/firestore/lite',
aggiungigetDoc
e rimuovionSnapshot
dall'elenco di importazione:
src/services.ts
import {
collection,
getDocs,
doc,
setDoc,
arrayUnion,
arrayRemove,
// onSnapshot, // firestore lite doesn't support realtime updates
query,
where,
documentId,
QuerySnapshot,
getDoc // add this import
} from 'firebase/firestore/lite';
- Aggiungi funzioni per recuperare i dati necessari per il rendering della pagina iniziale utilizzando Firestore Lite:
src/services.ts
export async function getTickerChanges(tickers: string[]): Promise<TickerChange[]> {
if (tickers.length === 0) {
return [];
}
const priceQuery = query(
collection(firestore, 'current'),
where(documentId(), 'in', tickers)
);
const snapshot = await getDocs(priceQuery);
performance && performance.measure("initial-data-load");
logPerformance();
return formatSDKStocks(snapshot);
}
export async function getTickers(user: User): Promise<string[]> {
const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
const data = (await getDoc(watchlistRef)).data();
return data ? data.tickers : [];
}
export async function getAllTickerChanges(): Promise<TickerChange[]> {
const tickersCollRef = collection(firestore, 'current');
const snapshot = await getDocs(tickersCollRef);
performance && performance.measure("initial-data-load");
logPerformance();
return formatSDKStocks(snapshot);
}
- Apri
src/firebase.ts
e modifica il percorso di importazione da'firebase/firestore'
a'firebase/firestore/lite':
src/firebase.ts
import { getFirestore } from 'firebase/firestore/lite';
Legateli tutti insieme
- Apri
src/main.ts.
- Avrai bisogno delle funzioni appena create per recuperare i dati per il rendering della pagina iniziale e un paio di funzioni di supporto per gestire lo stato dell'app. Quindi ora aggiorna le importazioni:
src/main.ts
import { renderLoginPage, renderUserPage } from './renderer';
import { getAllTickerChanges, getTickerChanges, getTickers } from './services';
import { onUserChange } from './auth';
import { getState, setRealtimeServicesLoaded, setUser } from './state';
import './styles.scss';
- Carica
src/services.realtime
utilizzando un'importazione dinamica nella parte superiore del file. La variabileloadRealtimeService
è una promessa che si risolverà con i servizi in tempo reale una volta caricato il codice. Lo utilizzerai in seguito per iscriverti agli aggiornamenti in tempo reale.
src/main.ts
const loadRealtimeService = import('./services.realtime');
loadRealtimeService.then(() => {
setRealtimeServicesLoaded(true);
});
- Cambia il callback di
onUserChange()
in una funzioneasync
, in modo da poter utilizzareawait
nel corpo della funzione:
src/main.ts
onUserChange(async user => {
// callback body
});
- Ora recupera i dati per eseguire il rendering della pagina iniziale utilizzando le nuove funzioni che abbiamo creato nel passaggio precedente.
Nel callback onUserChange()
, trova la condizione if in cui un utente ha effettuato l'accesso e copia e incolla il codice all'interno dell'istruzione if:
src/main.ts
onUserChange(async user => {
// LEAVE THE EXISTING CODE UNCHANGED HERE
...
if (user) {
// REPLACE THESE LINES
// user page
setUser(user);
// show loading screen in 500ms
const timeoutId = setTimeout(() => {
renderUserPage(user, {
loading: true,
tableData: []
});
}, 500);
// get data once if realtime services haven't been loaded
if (!getState().realtimeServicesLoaded) {
const tickers = await getTickers(user);
const tickerData = await getTickerChanges(tickers);
clearTimeout(timeoutId);
renderUserPage(user, { tableData: tickerData });
}
// subscribe to realtime updates once realtime services are loaded
loadRealtimeService.then(({ subscribeToTickerChanges }) => {
unsubscribeTickerChanges = subscribeToTickerChanges(user, stockData => {
clearTimeout(timeoutId);
renderUserPage(user, { tableData: stockData })
});
});
} else {
// DON'T EDIT THIS PART, YET
}
}
- Nel blocco else in cui nessun utente ha effettuato l'accesso, recupera le informazioni sui prezzi per tutte le azioni utilizzando Firestore Lite, visualizza la pagina, quindi ascolta le variazioni di prezzo una volta caricati i servizi in tempo reale:
src/main.ts
if (user) {
// DON'T EDIT THIS PART, WHICH WE JUST CHANGED ABOVE
...
} else {
// REPLACE THESE LINES
// login page
setUser(null);
// show loading screen in 500ms
const timeoutId = setTimeout(() => {
renderLoginPage('Landing page', {
loading: true,
tableData: []
});
}, 500);
// get data once if realtime services haven't been loaded
if (!getState().realtimeServicesLoaded) {
const tickerData = await getAllTickerChanges();
clearTimeout(timeoutId);
renderLoginPage('Landing page', { tableData: tickerData });
}
// subscribe to realtime updates once realtime services are loaded
loadRealtimeService.then(({ subscribeToAllTickerChanges }) => {
unsubscribeAllTickerChanges = subscribeToAllTickerChanges(stockData => {
clearTimeout(timeoutId);
renderLoginPage('Landing page', { tableData: stockData })
});
});
}
Vedi src/main.ts per il codice finito.
Verifica che l'app funzioni
- Esegui
npm run build
per ricostruire l'app. - Apri una scheda del browser su http://localhost:8080 o aggiorna la scheda esistente.
Controlla la dimensione del pacchetto
- Apri Chrome Devtools.
- Passa alla scheda Rete .
- Aggiorna la pagina per acquisire le richieste di rete
- Cerca
main.js
e controlla le sue dimensioni. - Ora sono solo 115 KB (34,5 KB compressi con gzip). Si tratta di un valore inferiore del 75% rispetto alla dimensione del pacchetto originale che era di 446 KB (138 KB compressi con gzip)! Di conseguenza, il sito si carica più di 2 secondi più velocemente con la connessione 3G: un ottimo miglioramento delle prestazioni e dell'esperienza utente!
8. Congratulazioni
Congratulazioni, hai aggiornato con successo l'app rendendola più piccola e più veloce!
Hai utilizzato i pacchetti compat per aggiornare l'app pezzo per pezzo e hai utilizzato Firestore Lite per accelerare il rendering della pagina iniziale, quindi caricare dinamicamente il Firestore principale per trasmettere in streaming le variazioni di prezzo.
Hai anche ridotto le dimensioni del bundle e migliorato il tempo di caricamento nel corso di questo codelab:
main.js | dimensione della risorsa (kb) | dimensione gzip (kb) | tempo di caricamento (s) (oltre 3g lenti) |
v8 | 446 | 138 | 4.92 |
compatibilità v9 | 429 | 124 | 4.65 |
v9 solo modulare Aut | 348 | 102 | 4.2 |
v9 completamente modulare | 244 | 74.6 | 3.66 |
v9 completamente modulare + Firestore lite | 117 | 34.9 | 2.88 |
Ora conosci i passaggi chiave necessari per aggiornare un'app Web che utilizza l'SDK JS Firebase v8 per utilizzare il nuovo SDK JS modulare.