با استفاده از افزونه 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 ارائه شده توسط افزونه، ساخت و ارائه بسته‌ها را شروع کنید.

بسته به مشخصات بسته، بسته درخواستی ممکن است از حافظه پنهان (cache) کلاینت، حافظه پنهان Firebase Hosting یا یک فایل Cloud Storage برگردانده شود. هنگامی که تمام حافظه‌های پنهان منقضی شدند، یک درخواست جدید برای سرویس، کوئری‌های Firestore را برای ساخت بسته بر اساس تقاضا فعال می‌کند.

شما می‌توانید با راه‌اندازی یک سایت Firebase Hosting که با استفاده از یک قانون بازنویسی به تابع serve اشاره می‌کند، از قابلیت‌های CDN Firebase Hosting بهره ببرید. CDNها بسته شما را در سرورهای مختلف کپی می‌کنند تا کاربران شما بتوانند بسته را به طور خودکار از نزدیکترین سرور بارگیری کنند. این رویکرد ترجیحی است.

برای تنظیم این مورد در Firebase Hosting، یک فایل firebase.json با محتوای زیر ایجاد یا ویرایش کنید و سایت را مستقر کنید :

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

پس از استقرار، می‌توانید با استفاده از URL سایت خود، از طریق CDN به بسته‌های خود دسترسی پیدا کنید. به عنوان مثال: 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 تعریف می‌شوند (به زیر مراجعه کنید).