Использование расширения Firestore Bundle Builder

Расширение Firestore Bundle Builder ( firestore-bundle-builder ) реализует HTTP-функцию, которая обслуживает пакеты данных Cloud Firestore . Вы определяете пакеты в документах Firestore, а расширение обслуживает пакет статических двоичных файлов данных через HTTP-запросы, используя различные встроенные механизмы кэширования, используя Firebase Hosting CDN или Cloud Storage. Если пакет отсутствует или срок действия существующих пакетов истек, эта функция по запросу создаст и кэширует новый пакет.

Чтобы использовать это расширение, необходимо сначала создать одну или несколько спецификаций пакетов в Firestore с помощью панели администратора расширения. Спецификация пакетов определяет, как определяются именованные запросы (запросы на коллекцию и конкретные пути к документам для добавления в пакет).

В спецификации пакета вы также можете определить параметры, предназначенные для использования в именованных запросах. Значения этих параметров задаются с помощью параметров URL-запроса при вызове HTTP-функции.

По ссылке выше вы найдёте инструкции по локальному запуску утилит администрирования. После настройки веб-приложения перейдите по адресу localhost:3000, чтобы создать спецификацию с помощью пользовательского интерфейса:

пример

Создание и обслуживание пакета

После установки расширения и создания спецификации пакета вы можете начать создавать и обслуживать пакеты, вызывая конечную точку HTTP, предоставляемую расширением.

В зависимости от спецификации пакета, запрошенный пакет может быть возвращён из кэша клиента, кэша Firebase Hosting или файла облачного хранилища. Когда срок действия всех кэшей истечёт, новый запрос на обслуживание инициирует запросы Firestore для сборки пакета по требованию.

Вы можете воспользоваться возможностями Firebase Hosting CDN, настроив сайт Firebase Hosting, который будет ссылаться на функцию serve с помощью правила перезаписи. CDN реплицируют ваш пакет на множество разных серверов, чтобы ваши пользователи могли автоматически загружать пакет с ближайшего сервера. Это предпочтительный подход.

Чтобы настроить это в Firebase Hosting, создайте или отредактируйте файл firebase.json со следующим содержимым и разверните сайт :

{
  "hosting": {
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "/bundles/*",
        "function": "ext-firestore-bundle-builder-serve"
      }
    ]
  }
}

После развертывания вы сможете получить доступ к своим пакетам из CDN, используя URL-адрес вашего сайта. Например: https://your-site-url.com/bundles/:bundleId .

Кроме того, вы можете настроить расширение для кэширования данных в облачном хранилище, если не хотите использовать Firebase Hosting. В этом случае для генерации пакетов вам потребуется вызвать развернутую HTTP-функцию напрямую.

Интеграция клиента

Далее вы можете использовать пакет с помощью API loadBundle пакета SDK Cloud Firestore. Сначала пакет необходимо загрузить, а затем предоставить его SDK. Например:

import { loadBundle } from "firebase/firestore";

// Download the bundle from the Firebase Hosting CDN:
const bundle = await fetch("/bundles/:bundleId");

// If not using a CDN, download the bundle directly:
// const bundle = await fetch('https://<location>-<project-id>.cloudfunctions.net/ext-firestore-bundle-builder-serve/:bundleId');

await loadBundle(bundle);

После загрузки вы сможете использовать данные из пакета:

Если при определении пакета вы указали массив путей к документам, вы можете получить данные документа на своем клиенте через этот пакет:

import { getFirestore, doc, getDocFromCache } from "firebase/firestore";
// Bundle Document IDs: ['users/92x1NgSWYKUC4AG4s2nHGMR2ikZ2']

const ref = doc(getFirestore(), "users/92x1NgSWYKUC4AG4s2nHGMR2ikZ2");
const snapshot = await getDocFromCache(ref);

Если вы указали запросы, вы можете использовать API namedQuery для запуска запроса из пакета:

import { getFirestore, namedQuery } from "firebase/firestore";
const query = await namedQuery(getFirestore(), "queryId");
const snapshot = await getDocsFromCache(query);

Идентификаторы запросов определяются как ключ определения каждого свойства queries (см. ниже).