אפשר לשלב בין Cloud Functions לבין Firebase Hosting כדי ליצור ולהציג את התוכן הדינמי שלכם או כדי ליצור ממשקי API ל-REST בתור מיקרו-שירותים.
Cloud Functions for Firebase מאפשרת להריץ באופן אוטומטי קוד backend בתגובה לבקשות HTTPS. הקוד שלכם מאוחסן בענן של Google ופועל בסביבה מנוהלת. אין צורך לנהל ולהרחיב את השרתים שלכם.
תרחישי שימוש לדוגמה ודוגמאות ל-Cloud Functions שמשולב עם Firebase Hosting זמינים בסקירה הכללית בנושא שרתים וירטואליים.
חיבור של Cloud Functions אל Firebase Hosting
בקטע הזה מופיעה דוגמה מפורטת לחיבור פונקציה ל-Firebase Hosting.
שימו לב: כדי לשפר את הביצועים של הצגת תוכן דינמי, אפשר לשנות את הגדרות המטמון.
שלב 1: הגדרת Cloud Functions
מוודאים שמותקנת הגרסה העדכנית של Firebase CLI ושהפעלתם את Firebase Hosting.
הוראות מפורטות להתקנת ה-CLI ולאתחול Hosting זמינות במאמר תחילת העבודה עם Hosting.
מוודאים שהגדרתם את Cloud Functions:
אם כבר הגדרתם את Cloud Functions, אתם יכולים להמשיך אל שלב 2: יצירה ובדיקה של פונקציית HTTPS.
אם לא הגדרתם את Cloud Functions:
מאתחלים את Cloud Functions על ידי הרצת הפקודה הבאה מתיקיית השורש של הפרויקט:
firebase init functions
כשמוצגת ההודעה, בוחרים באפשרות JavaScript (בדוגמה הזו נעשה שימוש ב-JS).
בודקים שיש ספרייה בשם
functionsבספריית הפרויקט המקומי (שנוצרה על ידי פקודת Firebase שהפעלתם). בספרייהfunctionsנמצא הקוד של Cloud Functions.
שלב 2: יוצרים פונקציית HTTPS לאתר Hosting ובודקים אותה
פותחים את
/functions/index.jsבעורך המועדף.מחליפים את התוכן של הקובץ בקוד הבא.
הקוד הזה יוצר פונקציית HTTPS (בשם
bigben) שמשיבה לבקשות HTTPS עםBONGלכל שעה ביום, כמו שעון.const functions = require('firebase-functions/v1'); exports.bigben = functions.https.onRequest((req, res) => { const hours = (new Date().getHours() % 12) + 1 // London is UTC + 1hr; res.status(200).send(`<!doctype html> <head> <title>Time</title> </head> <body> ${'BONG '.repeat(hours)} </body> </html>`); });בודקים את הפונקציות באופן מקומי באמצעות Firebase Local Emulator Suite.
מהרמה הבסיסית (root) של ספריית הפרויקט המקומית, מריצים את הפקודה הבאה:
firebase emulators:start
ניגשים לפונקציה באמצעות כתובת ה-URL המקומית שמוחזרת על ידי ה-CLI, לדוגמה:
.http://localhost:5001/PROJECT_ID/us-central1/bigben
מידע נוסף על בקשות HTTPS זמין בCloud Functionsמאמרי העזרה.
בשלב הבא מוסבר איך לגשת לפונקציית ה-HTTPS הזו מכתובת URL מסוג Firebase Hosting כדי שהיא תוכל ליצור תוכן דינמי לאתר שלכם שמתארח ב-Firebase.
שלב 3: הפניית בקשות HTTPS לפונקציה
בעזרת כללי שכתוב, אפשר להפנות בקשות שתואמות לדפוסים ספציפיים ליעד יחיד. השלבים הבאים מסבירים איך להפנות את כל הבקשות מהנתיב ../bigben באתר Hosting להפעלה של הפונקציה bigben.
פותחים את קובץ
firebase.json.מוסיפים את ההגדרה
rewriteבקטעhosting:"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/bigben", "function": { "functionId": "bigben", "region": "us-central1" // optional (see note below) "pinTag": true // optional (see note below) } } ] }כדי לוודא שההפניה האוטומטית פועלת כמו שצריך, צריך לבצע בדיקה נוספת באמצעות האמולטורים של Firebase.
מהרמה הבסיסית (root) של ספריית הפרויקט המקומית, מריצים את הפקודה הבאה:
firebase emulators:start
נכנסים לכתובת ה-URL של האתר שמתארח באופן מקומי, כפי שמוחזרת על ידי ה-CLI (בדרך כלל
localhost:5000), אבל מוסיפים לכתובת ה-URL אתbigben, כך:http://localhost:5000/bigben
מבצעים איטרציה על הפונקציה ועל הפונקציונליות שלה באתר. כדי לבדוק את האיטרציות האלה, אפשר להשתמש באמולטורים של Firebase.
כדי לקבל את הביצועים הכי טובים, כדאי למקם את הפונקציות באותו מיקום עם Hosting. לשם כך, בוחרים באחד מהאזורים הבאים:
us-west1us-central1us-east1europe-west1asia-east1
Hosting בדף ההגדרה יש פרטים נוספים על כללי כתיבה מחדש. אפשר גם לקרוא על סדר העדיפויות של התגובות להגדרות שונות של Hosting.
שימו לב: כדי לשפר את הביצועים של הצגת תוכן דינמי, אפשר לשנות את הגדרות המטמון.
שלב 4: פריסת הפונקציה
אחרי שמוודאים שהפונקציה פועלת כמו שרוצים באמולטור, אפשר להמשיך לפריסה, לבדיקה ולהרצה שלה עם משאבי פרויקט אמיתיים. זה זמן טוב לשקול הגדרת אפשרויות של זמן ריצה כדי לשלוט בהתנהגות של שינוי קנה המידה של פונקציות שפועלות בסביבת ייצור.
מריצים את הפקודה הבאה מתיקיית השורש של הפרויקט המקומי כדי לפרוס את הפונקציה, את התוכן ואת ההגדרות של Hosting באתר:
firebase deploy --only functions,hosting
אפשר לגשת לאתר הפעיל ולפונקציה בכתובות ה-URL הבאות:
תת-הדומיינים שלכם ב-Firebase:
PROJECT_ID.web.app/bigbenו-PROJECT_ID.firebaseapp.com/bigbenדומיינים מותאמים אישית שמקושרים:
CUSTOM_DOMAIN/bigben
שימוש ב-Web Framework
אתם יכולים להשתמש במסגרות אינטרנט כמו Express.js ב-Cloud Functions כדי להציג את התוכן הדינמי של האפליקציה ולכתוב אפליקציות אינטרנט מורכבות בקלות רבה יותר.
בקטע הבא מופיעה דוגמה מפורטת לשימוש ב-Express.js עם Firebase Hosting ו-Cloud Functions.
כדי להתקין את Express.js בפרויקט המקומי, מריצים את הפקודה הבאה מהספרייה
functions:npm install express --save
פותחים את קובץ
/functions/index.jsומייבאים ומפעילים את Express.js:const functions = require('firebase-functions/v1'); const express = require('express'); const app = express();
מוסיפים את שתי נקודות הקצה הבאות:
מוסיפים את נקודת הקצה הראשונה כדי להציג את האינדקס של האתר שלנו בכתובת
/.app.get('/', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.send(` <!doctype html> <head> <title>Time</title> <link rel="stylesheet" href="/style.css"> <script src="/script.js"></script> </head> <body> <p>In London, the clock strikes: <span id="bongs">${'BONG '.repeat(hours)}</span></p> <button onClick="refresh(this)">Refresh</button> </body> </html>`); });נקודת קצה נוספת להחזרת מספר
BONGכ-API בפורמט JSON, תחת/api:app.get('/api', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.json({bongs: 'BONG '.repeat(hours)}); });
מייצאים את אפליקציית Express.js כפונקציית HTTPS:
exports.app = functions.https.onRequest(app);
בקובץ
firebase.json, מפנים את כל הבקשות לפונקציהapp. הכתיבה מחדש הזו מאפשרת ל-Express.js להציג את נתיבי המשנה השונים שהגדרנו (בדוגמה הזו,/ו-/api).{ "hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "**", "function": "app" } ] } }
הוספת תוכנת ביניים
נמשיך עם הדוגמה שלנו. עכשיו, כשאתם משתמשים ב-Express.js, אתם יכולים להוסיף תוכנת ביניים של Express.js בדרך הרגילה. לדוגמה, אפשר להפעיל בקשות CORS בנקודות הקצה (endpoints) שלנו.
כדי להתקין את תוכנת הביניים
cors, מריצים את הפקודה הבאה:npm install --save cors
פותחים את הקובץ
/functions/index.jsומוסיפים אתcorsלאפליקציית Express.js, באופן הבא:const cors = require('cors')({origin: true}); app.use(cors);
בCloud Functions מסמכי התיעוד אפשר לקרוא מידע נוסף על שימוש ב-Firebase עם אפליקציות Express ומודולים של תוכנת ביניים.
השלבים הבאים
מגדירים שמירה במטמון של התוכן הדינמי ברשת CDN גלובלית.
אינטראקציה עם שירותים אחרים של Firebase באמצעות Firebase Admin SDK.
כדאי לעיין בתמחור ובמכסות והמגבלות של Cloud Functions.