Usando la extensión Firestore Bundle Builder

La extensión Firestore Bundle Builder ( firestore-bundle-builder ) implementa una función HTTP que sirve paquetes de datos de Cloud Firestore . Los paquetes se definen en documentos de Firestore y la extensión ofrece paquetes de datos de archivos binarios estáticos a través de solicitudes HTTP, junto con varios mecanismos de almacenamiento en caché integrados mediante Firebase Hosting CDN o Cloud Storage. Cuando no existe ningún paquete o los paquetes existentes han caducado, esta función creará y almacenará en caché un nuevo paquete a pedido.

Para usar esta extensión, primero debe crear una o más especificaciones de paquete en Firestore usando el panel de administración de la extensión. La especificación del paquete es cómo se definen las consultas con nombre (consultas de colección y rutas de documentos específicas para agregar al paquete).

Dentro de la especificación del paquete, también puede definir parámetros destinados a usarse en consultas con nombre. Los valores para estos parámetros se establecen mediante parámetros de consulta de URL cuando se llama a la función HTTP.

El enlace anterior proporciona algunas instrucciones para que pueda ejecutar las utilidades de administración localmente. Una vez que haya configurado la aplicación web, navegue hasta localhost:3000 para crear una especificación usando la interfaz de usuario:

ejemplo

Construyendo y sirviendo el paquete

Una vez que haya instalado la extensión y haya creado una especificación de paquete, puede comenzar a crear y ofrecer paquetes llamando al punto final HTTP proporcionado por la extensión.

Según la especificación del paquete, el paquete solicitado puede devolverse desde la caché del cliente, la caché de Firebase Hosting o un archivo de Cloud Storage. Cuando todos los cachés hayan caducado, una nueva solicitud de servicio activará consultas de Firestore para crear el paquete a pedido.

Puede aprovechar las capacidades de Firebase Hosting CDN configurando un sitio de Firebase Hosting que apunte a la función de servicio mediante una regla de reescritura. Las CDN replican su paquete en muchos servidores diferentes, de modo que sus usuarios puedan cargar el paquete desde el servidor más cercano automáticamente. Este es el enfoque preferido.

Para configurar esto en Firebase Hosting, cree o edite un archivo firebase.json con el siguiente contenido e implemente el sitio :

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

Una vez implementado, puede acceder a sus paquetes desde la CDN utilizando la URL de su sitio. Por ejemplo: https://your-site-url.com/bundles/:bundleId .

Alternativamente, puede configurar la extensión para almacenar en caché los datos en Cloud Storage si no desea utilizar Firebase Hosting. En este caso, llamaría directamente a la función HTTP implementada para generar paquetes.

Integración de clientes

A continuación, puede consumir un paquete con la API loadBundle de los SDK de Cloud Firestore. Primero es necesario descargar el paquete y luego proporcionarlo al SDK. Por ejemplo:

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

Una vez cargado, puede utilizar los datos del paquete:

Si especificó una serie de rutas de documentos cuando definió el paquete, puede obtener los datos del documento en su cliente a través del paquete:

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

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

Si especificó consultas, puede usar la API namedQuery para ejecutar una consulta desde el paquete:

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

Los ID de consulta se definen como una clave de la definición de propiedad de cada queries (ver más abajo).