Использование расширения 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 или файла облачного хранилища. Когда срок действия всех кешей истечет, новый запрос на обслуживание вызовет запросы Firestore для создания пакета по требованию.

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

Чтобы настроить это на хостинге Firebase, создайте или отредактируйте файл 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. В этом случае вы должны вызвать развернутую функцию 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 (см. ниже).