שיטות מומלצות ל-Firebase JavaScript SDK

בדף הזה מפורטות טיפים ודרכים לפתרון בעיות ב-JavaScript שעשויות להתרחש במהלך השימוש ב-SDK של Firebase JavaScript.

נתקלת בבעיות אחרות או שהבעיה שלך לא מופיעה ברשימה? מומלץ לעיין בשאלות הנפוצות הראשיות בנושא Firebase כדי לקבל שאלות נפוצות נוספות בנושא Firebase או שאלות נפוצות ספציפיות למוצרים.

אפשר גם להיכנס למאגר GitHub של Firebase JavaScript SDK כדי למצוא רשימה עדכנית של בעיות שדווחו ודרכים לפתרון בעיות, וגם לדווח על בעיות משלכם.

ה-Admin SDK של מבנים ב-Node.js לא תואם ל-SDK של Firebase JavaScript

ה-Firebase Admin SDK ל-Node.js וה-SDK של Firebase JavaScript הם הטמעות נפרדות שלא משתפות הגדרות של ממשק, כיתה או פונקציה. מכונות של אובייקטים מסוג Admin SDK לא תואמות לפונקציות של Firebase JavaScript SDK.

לדוגמה, מופע של FirebaseApp של Admin SDK שהוענק לפונקציה getDatabase של JavaScript SDK של Firebase יגרום לשגיאה הבאה:

TypeError: Cannot read properties of undefined (reading 'getProvider')
 at _getProvider
 at getDatabase

זה נכון לגבי כל ממשק ה-API של Firebase JavaScript SDK, ולא רק לגבי Realtime Database. אותו הדבר נכון גם לגבי שימוש בכיוון ההפוך. אם מנסים להשתמש בסוג Timestamp של Cloud Firestore JS SDK עם Firebase Admin SDK ל-Node.js, מתקבלות שגיאות דומות.

הימנעות משימוש בגרסאות סותרות של SDK של Firebase JavaScript

אם יש כמה גרסאות סותרות של ה-SDK של Firebase JavaScript שמוגדרות כיחסי תלות בפרויקט, הן יגרמו לשגיאות זמן ריצה כשמועברות בין חבילות ה-SDK. לדוגמה, שימוש בספרייה Data Connect עם גרסה לא תואמת של FirebaseApp גורם לשגיאה הבאה:

Error: Component data-connect has not been registered yet

בדרך כלל הבעיה הזו נגרמת כתוצאה מעדכון של תלות באחת מחבילות Firebase SDK, אבל לא בכל החבילות. המצב הזה קורה לעיתים קרובות כשכלי אוטומטי לעדכון יחסי התלות משנה קבוצת משנה של יחסי התלות של Firebase SDK בקובץ yarn.lock או package-lock.json של הפרויקט. מאחר שגרסאות רבות של Firebase JavaScript SDK פועלות יחד, השימוש בגרסאות שונות של ה-SDK גורם לאי-תאימות בסביבת זמן הריצה.

כדי לפתור את הבעיה, מוחקים את הספרייה node_modules‎/ ואת הקובץ yarn.lock (ב-yarn) או package-lock.json (ב-npm) בפרויקט ומתקינים מחדש את יחסי התלות.

אם השגיאות נמשכות, ממשיכים לנפות את הבאגים באמצעות הפקודה npm ls. הפקודה הזו תתעד את יחסי התלות של הפרויקט כדי שתוכלו לזהות גרסאות סותרות של מודול firebase.

לדוגמה, ביומן הבא מוצג package-using-older-firebase שמייבא גרסת SDK של Firebase JavaScript שנמצאת בסכסוך:

$ npm ls firebase --all
your-app@0.0.0
├── firebase@11.2.0
├─┬ @angular/fire@19.0.0
│ ├── firebase@11.2.0 deduped
│ └─┬ rxfire@6.1.0
│   └── firebase@10.14.1 deduped
└─┬ package-using-older-firebase@0.1.0
  └─── firebase@10.14.1

שגיאות יכולות להתרחש גם בגלל שילוב של הצהרות require ו-import של CJS ו-ESM באפליקציה. כך נוצרות כמה מכונות של SDK של Firebase JavaScript, שכל אחת מהן שונה מהשנייה, וכתוצאה מכך היכולת של SDK של Firebase JavaScript לפעול עם רכיבים אחרים נפגעת. כדי לנפות באגים בתרחיש הזה, צריך להגדיל את רמת הפירוט של ה-bundler שבחרתם. לדוגמה, אפשר להשתמש בדגל analyze של esbuild למטרה הזו.

מוודאים ששירותי ה-Workers מקובצים

בדרך כלל, קובצי שירות נוצרים מצינור עיבוד נתונים נפרד משאר אפליקציית האינטרנט, והם לא כלולים בהגדרת ברירת המחדל של חבילות כמו Webpack.

אם אתם משתמשים בגרסה המודולרית של Firebase JavaScript SDK בתוך ה-service worker, עליכם להגדיר את ה-bundler של האפליקציה כך שיכלול את קובץ המקור של ה-service worker. בדוגמה הבאה נעשה שימוש ב-npx כדי לארוז את ה-service worker של firebase-sw.js בספרייה src של הפרויקט:

npx esbuild ./src/firebase-sw.js --bundle --minify --main-fields=webworker,browser,module,main,default --outfile=public/firebase-sw.js

הפעלת קובץ שירות (service worker) שלא נכלל בחבילה תיכשל אם הוא כולל מקורות של מודולים של ES לאיмпорт שלא תומכים בקובצי שירות, או קבצים שלא קיימים בהיקף של קובץ השירות. לפעמים הכישלונות האלה שקטים וקשה לנפות באגים.

במאמר שימוש ב-bundlers של מודולים עם Firebase מוסבר איך לצרף לאפליקציה את הגרסה המודולרית של ה-SDK של Firebase JavaScript.

לחלופין, אפשר לבטל את הצורך בחבילות על ידי ייבוא חבילות ה-SDK של compat Firebase JavaScript מה-CDN:

// Give the service worker access to Firebase Messaging.
// Replace 10.13.2 with the version of the Firebase JS SDK you're using
// in your app.
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-messaging-compat.js');

// Initialize the Firebase app in the service worker by passing in
// your app's Firebase config object.
// https://firebase.google.com/docs/web/setup#config-object
firebase.initializeApp({
  ...
});

// Retrieve an instance of Firebase Messaging so that it can handle
// background messages.
const messaging = firebase.messaging();

שימוש ב-FirebaseServerApp כשעובדים עם עיבוד בצד השרת

ה-SDK של Firebase JavaScript נועד במקור לפעול בסביבות דפדפן. ההשקה של מסגרות עיבוד בצד השרת (SSR) מרחיבה את השימוש ב-SDK לסביבות חדשות בסביבת זמן הריצה. סביבות זמן הריצה האלה מספקות קבוצת משנה של כלים וממשקי API שדפדפני אינטרנט מספקים.

לדוגמה, חלק מ-SDK של Firebase דורשים שמירת נתונים במטמון באמצעות IndexedDB, API לשימוש בדפדפן בלבד. יכול להיות שתצטרכו אינטראקציה של משתמשים בתהליכי כניסה מסוימים ב-Firebase Auth, וזה לא אפשרי בסביבות שרת ללא ממשק גרפי. App Check מסתמך על שיטות ניתוח נתונים (heuristics) בדפדפן כדי לאמת את המשתמש לפני יצירת אסימוני App Check.

כשעובדים עם ה-SDK בסביבות החדשות האלה, צריך להשתמש ב-FirebaseServerApp, וריאנט חדש של FirebaseApp שמאפשר לטעון מראש את מכונה של Firebase עם SSR באמצעות נתונים שנאספו מצד הלקוח.

הפונקציה FirebaseServerApp תומכת בשני פרמטרים:

  • אסימון מזהה אימות: אם הוא מסופק, Firebase Auth יבצע כניסה אוטומטית של משתמש שכבר אומת, ויכול להיות שהכניסה תהיה לכל אורך הסשן, גם בצד הלקוח וגם בצד השרת.
  • אסימון לבדיקה של אפליקציה: אם האסימון מסופק, ערכות ה-SDK האחרות של Firebase משתמשות בו בלי צורך לאתחל מכונה של לקוח App Check (שאין תמיכה בו מחוץ לסביבות דפדפן). הפעולה הזו תאפשר תמיכה ב-SSR במוצרים שבהם App Check מופעל, כמו Cloud Functions,‏ Data Connect,‏ Cloud Firestore,‏ Realtime Database ו-Vertex AI.

דוגמה לשימוש ב-FirebaseServerApp ב-Next.js מופיעה במאמר ייעול פיתוח אפליקציות SSR באמצעות FirebaseServerApp.