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

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

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

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

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

пример

Создание и предоставление пакета

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

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

Вы можете воспользоваться возможностями CDN Firebase Hosting, настроив сайт 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, вы можете настроить расширение для кэширования данных в Cloud Storage. В этом случае вам нужно будет напрямую вызвать развернутую 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 (см. ниже).