モジュラー Firebase JS SDK に移行してウェブアプリを強化する

1. 始める前に

モジュール型の Firebase JS SDK は、既存の JS SDK を書き直したもので、次のメジャー バージョンとしてリリースされます。これにより、デベロッパーは Firebase JS SDK から未使用のコードを除外して、バンドルを小さくし、パフォーマンスを向上させることができます。

モジュラー JS SDK の最も大きな違いは、機能がすべてを含む単一の firebase 名前空間ではなく、インポートするフリー フローティング関数に整理されていることです。この新しいコード構成方法により、ツリー シェイキングが可能になります。ここでは、現在 v8 Firebase JS SDK を使用しているアプリを新しいモジュール式にアップグレードする方法について説明します。

スムーズなアップグレード プロセスを実現するために、互換性パッケージのセットが提供されています。この Codelab では、互換性パッケージを使用してアプリを少しずつ移植する方法を学びます。

作成するアプリの概要

この Codelab では、v8 JS SDK を使用する既存の株価ウォッチリスト ウェブアプリを、次の 3 つの段階で新しいモジュラー JS SDK に段階的に移行します。

  • 互換性パッケージを使用するようにアプリをアップグレードする
  • 互換性パッケージからモジュラー API にアプリを段階的にアップグレードする
  • Firestore SDK の軽量実装である Firestore Lite を使用して、アプリのパフォーマンスをさらに向上させる

2d351cb47b604ad7.png

この Codelab では、Firebase SDK のアップグレードに焦点を当てます。その他のコンセプトとコードブロックについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。

必要なもの

  • 任意のブラウザ(Chrome など)
  • 任意の IDE またはテキスト エディタ(WebStormAtomSublimeVS Code など)
  • 通常は Node.js に付属しているパッケージ マネージャー npm
  • Codelab のサンプルコード(コードの取得方法については、Codelab の次の手順を参照してください)。

2. セットアップする

コードを取得する

このプロジェクトに必要なものはすべて Git リポジトリにあります。まず、コードを取得して、お好みの開発環境で開く必要があります。

コマンドラインから、この Codelab の Github リポジトリのクローンを作成します。

git clone https://github.com/FirebaseExtended/codelab-modular-sdk.git

または、git がインストールされていない場合は、リポジトリを ZIP ファイルとしてダウンロードし、ダウンロードした ZIP ファイルを解凍します。

アプリをインポートする

  1. IDE を使用して、codelab-modular-sdk ディレクトリを開くか、インポートします。
  2. npm install を実行して、アプリをローカルでビルドして実行するために必要な依存関係をインストールします。
  3. npm run build を実行してアプリをビルドします。
  4. npm run serve を実行してウェブサーバーを起動します。
  5. ブラウザタブを開いて http://localhost:8080 にアクセスします。

71a8a7d47392e8f4.png

3. ベースラインを確立する

出発点の概要

出発点は、この Codelab 用に設計された株価ウォッチリスト アプリです。コードは、この Codelab のコンセプトを示すために簡略化されており、エラー処理はほとんどありません。本番環境のアプリでこのコードを再利用する場合は、エラーを処理し、すべてのコードを十分にテストしてください。

アプリのすべての機能が動作することを確認します。

  1. 右上にある [ログイン] ボタンを使用して、匿名でログインします。
  2. ログイン後、[追加] ボタンをクリックし、文字を入力して、下に表示される検索結果の行をクリックして、「NFLX」、「SBUX」、「T」を検索してウォッチリストに追加します。
  3. 行の末尾にある [x] をクリックして、株価モニターから株を削除します。
  4. 株価のリアルタイムの更新を確認します。
  5. Chrome DevTools を開き、[ネットワーク] タブに移動して、[キャッシュを無効にする] と [リクエスト行を大きくする] をオンにします。[キャッシュを無効にする] をオンにすると、更新後に常に最新の変更が取得されます。[大きなリクエスト行を使用する] をオンにすると、リソースの送信サイズとリソースサイズの両方が行に表示されます。この Codelab では、主に main.js のサイズに関心があります。

48a096debb2aa940.png

  1. シミュレートされたスロットリングを使用して、さまざまなネットワーク条件でアプリを読み込みます。この Codelab では、読み込み時間を測定するために Slow 3G を使用します。これは、バンドルサイズを小さくすることが最も効果的な状況だからです。

4397cb2c1327089.png

それでは、アプリを新しいモジュール式 API に移行しましょう。

4. 互換性パッケージを使用する

互換性パッケージを使用すると、すべての Firebase コードを一度に変更することなく、新しい SDK バージョンにアップグレードできます。モジュール型 API に段階的にアップグレードできます。

このステップでは、Firebase ライブラリを v8 から新しいバージョンにアップグレードし、互換性パッケージを使用するようにコードを変更します。次の手順では、まず Firebase Auth コードのみをアップグレードしてモジュラー API を使用し、次に Firestore コードをアップグレードする方法について説明します。

各ステップの最後に、アプリをコンパイルして実行できるようになり、各プロダクトを移行するにつれてバンドルサイズが小さくなることが確認できます。

新しい SDK を入手する

package.json で依存関係のセクションを見つけて、次の内容に置き換えます。

package.json

"dependencies": {
    "firebase": "^9.0.0" 
}

依存関係を再インストールする

依存関係のバージョンを変更したため、npm install を再実行して依存関係の新しいバージョンを取得する必要があります。

インポート パスを変更する

互換性パッケージはサブモジュール firebase/compat の下に公開されているため、インポート パスを適宜更新します。

  1. ファイル src/firebase.ts に移動
  2. 既存のインポートを次のインポートに置き換えます。

src/firebase.ts

import firebase from 'firebase/compat/app'; 
import 'firebase/compat/auth'; 
import 'firebase/compat/firestore';

アプリが動作することを確認する

  1. npm run build を実行してアプリを再ビルドします。
  2. ブラウザタブを開いて http://localhost:8080 にアクセスするか、既存のタブを更新します。
  3. アプリを操作します。すべてが正常に動作しているはずです。

5. モジュラー API を使用するように Auth をアップグレードする

Firebase プロダクトは任意の順序でアップグレードできます。この Codelab では、Auth API が比較的シンプルなため、まず Auth をアップグレードして基本的なコンセプトを学びます。Firestore のアップグレードはもう少し複雑です。次のセクションで、その方法について説明します。

Auth の初期化を更新

  1. ファイル src/firebase.ts に移動
  2. 次のインポートを追加します。

src/firebase.ts

import { initializeAuth, indexedDBLocalPersistence } from 'firebase/auth';
  1. import ‘firebase/compat/auth'. を削除します
  2. export const firebaseAuth = app.auth(); を次のように置き換えます。

src/firebase.ts

export const firebaseAuth = initializeAuth(app, { persistence: [indexedDBLocalPersistence] });
  1. ファイルの末尾にある export type User = firebase.User; を削除します。Usersrc/auth.ts に直接エクスポートされます。この src/auth.ts は次のステップで変更します。

認証コードを更新する

  1. ファイル src/auth.ts に移動
  2. ファイルの先頭に次のインポートを追加します。

src/auth.ts

import { 
    signInAnonymously, 
    signOut,
    onAuthStateChanged,
    User
} from 'firebase/auth';
  1. ‘firebase/auth'. から User をすでにインポートしているため、import { firebaseAuth, User } from './firebase'; から User を削除します
  2. モジュール方式の API を使用するように関数を更新します。

インポート文を更新したときに説明したように、バージョン 9 のパッケージはインポート可能な関数を中心に構成されています。これは、ドットチェーンの名前空間とサービス パターンに基づくバージョン 8 の API とは対照的です。この新しいコードの構成により、未使用のコードのツリー シェイキングが可能になります。ビルドツールがどのコードが使用され、どのコードが使用されていないかを分析できるためです。

バージョン 9 では、関数に最初の引数としてサービスが渡されます。サービスは、Firebase サービスを初期化して取得するオブジェクトです(getAuth()initializeAuth() から返されるオブジェクトなど)。特定の Firebase サービスの状態を保持し、関数はその状態を使用してタスクを実行します。このパターンを適用して、次の関数を実装します。

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

アプリが動作することを確認する

  1. npm run build を実行してアプリを再ビルドします。
  2. ブラウザタブを開いて http://localhost:8080 にアクセスするか、既存のタブを更新します。
  3. アプリを操作します。すべてが正常に動作しているはずです。

バンドルサイズを確認する

  1. Chrome DevTools を開きます。
  2. [ネットワーク] タブに切り替えます。
  3. ページを更新して、ネットワーク リクエストを取得します。
  4. main.js を探して、そのサイズを確認します。コードを数行変更するだけで、バンドルサイズを 100 KB(gzip 形式で圧縮すると 36 KB)削減できました。これは約 22% の削減です。また、低速の 3G 接続でのサイトの読み込みも 0.75 秒速くなっています。

2e4eafaf66cd829b.png

6. モジュラー API を使用するように Firebase アプリと Firestore をアップグレードする

Firebase の初期化を更新する

  1. ファイル src/firebase.ts. に移動
  2. import firebase from ‘firebase/compat/app'; を次のように置き換えます。

src/firebase.ts

import { initializeApp } from 'firebase/app';
  1. const app = firebase.initializeApp({...}); を次のように置き換えます。

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.firebasestorage.app", 
    messagingSenderId: "875614679042", 
    appId: "1:875614679042:web:5813c3e70a33e91ba0371b"
});

Firestore の初期化を更新

  1. 同じファイル src/firebase.ts, で、import 'firebase/compat/firestore';

src/firebase.ts

import { getFirestore } from 'firebase/firestore';
  1. export const firestore = app.firestore(); を次のように置き換えます。

src/firebase.ts

export const firestore = getFirestore();
  1. export const firestore = ...」以降のすべての行を削除する

インポートを更新する

  1. ファイル src/services.ts. を開く
  2. インポートから FirestoreFieldPathFirestoreFieldValueQuerySnapshot を削除します。'./firebase' からのインポートは次のようになります。

src/services.ts

import { firestore } from './firebase';
  1. 使用する関数と型をファイルの上部にインポートします。
    **src/services.ts**
import { 
    collection, 
    getDocs, 
    doc, 
    setDoc, 
    arrayUnion, 
    arrayRemove, 
    onSnapshot, 
    query, 
    where, 
    documentId, 
    QuerySnapshot
} from 'firebase/firestore';
  1. すべてのティッカーを含むコレクションへの参照を作成します。

src/services.ts

const tickersCollRef = collection(firestore, 'current');
  1. getDocs() を使用して、コレクションからすべてのドキュメントを取得します。

src/services.ts

const tickers = await getDocs(tickersCollRef);

完成したコードについては、search() をご覧ください。

addToWatchList() を更新

doc() を使用してユーザーのウォッチリストへのドキュメント参照を作成し、arrayUnion() を使用して setDoc() でティッカーを追加します。

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

Update deleteFromWatchList()

同様に、arrayRemove() を使用して setDoc() でユーザーのウォッチリストからティッカーを削除します。

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

subscribeToTickerChanges() を更新

  1. doc() を使用して、まずユーザーのウォッチリストへのドキュメント参照を作成し、次に onSnapshot() を使用してウォッチリストの変更をリッスンします。

src/services.ts

const watchlistRef = doc(firestore, `watchlist/${user.uid}`);
const unsubscribe = onSnapshot(watchlistRef, snapshot => {
   /* subscribe to ticker price changes */
});
  1. ウォッチリストにティッカーを追加したら、query() を使用して価格を取得するクエリを作成し、onSnapshot() を使用して価格の変更をリッスンします。

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

完全な実装については、subscribeToTickerChanges() をご覧ください。

subscribeToAllTickerChanges() を更新

まず、collection() を使用して、すべてのティッカーの価格を含むコレクションへの参照を作成し、次に onSnapshot() を使用して価格の変更をリッスンします。

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

アプリが動作することを確認する

  1. npm run build を実行してアプリを再ビルドします。
  2. ブラウザタブを開いて http://localhost:8080 にアクセスするか、既存のタブを更新します。
  3. アプリを操作します。すべてが正常に動作しているはずです。

バンドルサイズを確認する

  1. Chrome DevTools を開きます。
  2. [ネットワーク] タブに切り替えます。
  3. ページを更新して、ネットワーク リクエストを取得します。
  4. main.js を探して、そのサイズを確認します。元のバンドルサイズと再度比較すると、バンドルサイズが 200 KB 以上(gzip 形式で圧縮すると 63.8 KB)縮小され、50% 小さくなっています。これは、読み込み時間が 1.3 秒短縮されることを意味します。

7660cdc574ee8571.png

7. Firestore Lite を使用して、最初のページのレンダリングを高速化する

Firestore Lite とは

Firestore SDK は、複雑なキャッシュ保存、リアルタイム ストリーミング、永続ストレージ、マルチタブ オフライン同期、再試行、楽観的同時実行など、多くの機能を提供するため、サイズがかなり大きくなります。高度な機能は必要なく、データを 1 回だけ取得したい場合もあります。このようなケースに対応するため、Firestore はシンプルで軽量なソリューションである Firestore Lite という新しいパッケージを作成しました。

Firestore Lite の優れたユースケースの 1 つは、最初のページ レンダリングのパフォーマンスを最適化することです。この場合、ユーザーがログインしているかどうかを確認し、Firestore からデータを読み取って表示するだけで済みます。

このステップでは、Firestore Lite を使用してバンドルサイズを縮小し、初期ページのレンダリングを高速化してから、メインの Firestore SDK を動的に読み込んでリアルタイム更新をサブスクライブする方法について学習します。

コードをリファクタリングして、次のことを行います。

  1. リアルタイム サービスを別のファイルに移動して、動的インポートを使用して動的に読み込めるようにします。
  2. Firestore Lite を使用してウォッチリストと株価を取得する新しい関数を作成します。
  3. 新しい Firestore Lite 関数を使用してデータを取得し、最初のページ レンダリングを行い、リアルタイム サービスを動的に読み込んでリアルタイム アップデートをリッスンします。

リアルタイム サービスを新しいファイルに移動する

  1. src/services.realtime.ts. という名前の新しいファイルを作成します。
  2. 関数 subscribeToTickerChanges()subscribeToAllTickerChanges()src/services.ts から新しいファイルに移動します。
  3. 新しいファイルの先頭に必要なインポートを追加します。

ここでも、いくつかの変更を加える必要があります。

  1. まず、関数の使用対象となるファイルの先頭で、メインの Firestore SDK から Firestore インスタンスを作成します。ここでは、Firestore インスタンスを firebase.ts からインポートできません。これは、いくつかの手順で Firestore Lite インスタンスに変更するためです。このインスタンスは、最初のページ レンダリングでのみ使用されます。
  2. 次に、firstload 変数と、それによって保護されている if ブロックを削除します。これらの機能は、次のステップで作成する新しい関数に移行されます。

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

Firestore Lite を使用してデータを取得する

  1. src/services.ts. を開く
  2. インポート パスを ‘firebase/firestore' から ‘firebase/firestore/lite', に変更し、getDoc を追加して、インポート リストから onSnapshot を削除します。:

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';
  1. 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);
}
  1. src/firebase.ts を開き、インポート パスを ‘firebase/firestore' から ‘firebase/firestore/lite': に変更します。

src/firebase.ts

import { getFirestore } from 'firebase/firestore/lite';

すべてをまとめる

  1. src/main.ts. を開く
  2. 初期ページのレンダリング用のデータを取得する新しい関数と、アプリの状態を管理するヘルパー関数がいくつか必要になります。インポートを更新します。

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';
  1. ファイルの先頭にある動的インポートを使用して src/services.realtime を読み込みます。変数 loadRealtimeService は、コードが読み込まれるとリアルタイム サービスで解決される Promise です。これは、後でリアルタイム更新を購読するために使用します。

src/main.ts

const loadRealtimeService = import('./services.realtime');
loadRealtimeService.then(() => {
   setRealtimeServicesLoaded(true);
});
  1. onUserChange() のコールバックを async 関数に変更し、関数本体で await を使用できるようにします。

src/main.ts

onUserChange(async user => {
 // callback body
});
  1. 次に、前の手順で作成した新しい関数を使用して、最初のページ レンダリングを行うためのデータを取得します。

onUserChange() コールバックで、ユーザーがログインしている場合の if 条件を見つけ、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   
   }
}
  1. ユーザーがログインしていない else ブロックでは、firestore lite を使用してすべての株価情報を取得し、ページをレンダリングしてから、リアルタイム サービスが読み込まれたら株価の変更をリッスンします。

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

完成したコードについては、src/main.ts をご覧ください。

アプリが動作することを確認する

  1. npm run build を実行してアプリを再ビルドします。
  2. ブラウザタブを開いて http://localhost:8080 にアクセスするか、既存のタブを更新します。

バンドルサイズを確認する

  1. Chrome DevTools を開きます。
  2. [ネットワーク] タブに切り替えます。
  3. ページを更新してネットワーク リクエストを取得する
  4. main.js を探して、そのサイズを確認します。
  5. 現在は 115 KB(gzip 形式で圧縮すると 34.5 KB)です。これは、元のバンドルサイズ(446 KB、gzip 形式で圧縮すると 138 KB)よりも 75% 小さくなっています。その結果、3G 接続でのサイトの読み込み速度が 2 秒以上速くなり、パフォーマンスとユーザー エクスペリエンスが大幅に向上しました。

9ea7398a8c8ef81b.png

8. 完了

お疲れさまでした。アプリをアップグレードし、サイズを小さくして高速化することができました。

互換性パッケージを使用してアプリを少しずつアップグレードし、Firestore Lite を使用して最初のページのレンダリングを高速化してから、メインの Firestore を動的に読み込んで価格の変更をストリーミングしました。

この Codelab では、バンドルサイズを縮小し、読み込み時間を短縮しました。

main.js

リソース サイズ(KB)

gzip 圧縮後のサイズ(KB)

読み込み時間(秒)(低速 3G)

v8

446

138

4.92

v9 compat

429

124

4.65

v9 のみのモジュラー Auth

348

102

4.2

v9 完全モジュラー

244

74.6

3.66

v9 完全モジュラー + Firestore Lite

117

34.9

2.88

32a71bd5a774e035.png

これで、v8 Firebase JS SDK を使用するウェブアプリを新しいモジュラー JS SDK を使用するようにアップグレードするために必要な主な手順がわかりました。

参考資料

リファレンス ドキュメント