يمكنك إقران Cloud Functions مع Firebase Hosting لإنشاء المحتوى الديناميكي وعرضه أو إنشاء واجهات برمجة تطبيقات REST كخدمات صغيرة.
يتيح لك Cloud Functions for Firebase تنفيذ رمز برمجي في الخلفية تلقائيًا استجابةً لطلبات HTTPS. يتم تخزين الرمز البرمجي في السحابة الإلكترونية من Google ويتم تنفيذه في بيئة مُدارة. لست بحاجة إلى إدارة الخوادم وتوسيع نطاقها.
للاطّلاع على أمثلة على حالات الاستخدام وعينات Cloud Functions المدمجة مع Firebase Hosting، يُرجى الانتقال إلى نظرة عامة حول تكنولوجيا السحابة غير المزوّدة بخادم.
ربط Cloud Functions بـ Firebase Hosting
يقدّم هذا القسم مثالاً تفصيليًا لربط دالة بعلامة Firebase Hosting.
يُرجى العِلم أنّه لتحسين أداء عرض المحتوى الديناميكي، يمكنك تعديل إعدادات ذاكرة التخزين المؤقت اختياريًا.
الخطوة 1: إعداد Cloud Functions
تأكَّد من تثبيت أحدث إصدار من واجهة برمجة التطبيقات Firebase CLI ومن أنّك أعددت Firebase Hosting.
للحصول على تعليمات مفصّلة حول تثبيت واجهة برمجة التطبيقات وبدء استخدام Hosting، يُرجى الاطّلاع على دليل بدء استخدام Hosting.
تأكَّد من ضبط Cloud Functions:
إذا سبق لك إعداد Cloud Functions، يمكنك المتابعة إلى الخطوة 2: إنشاء واختبار دالة HTTPS.
إذا لم يتم إعداد Cloud Functions:
يمكنك إعداد Cloud Functions من خلال تنفيذ الأمر التالي من جذر دليل مشروعك:
firebase init functions
اختَر JavaScript عندما يُطلب منك ذلك (يستخدم مثال الجولة الإرشادية هذا JavaScript).
تأكَّد من توفُّر دليل
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.
من جذر دليل المشروع على الجهاز، نفِّذ المحاولة التالية:
firebase emulators:start
يمكنك الوصول إلى الدالة من خلال عنوان URL المحلي الذي تعرضه واجهة سطر الأوامر، على سبيل المثال:
.http://localhost:5001/PROJECT_ID/us-central1/bigben
يُرجى الانتقال إلى مستندات Cloud Functions للاطّلاع على مزيد من المعلومات عن طلبات HTTPS.
سترشدك الخطوة التالية إلى كيفية الوصول إلى وظيفة 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.
من جذر دليل المشروع على الجهاز، نفِّذ المحاولة التالية:
firebase emulators:start
انتقِل إلى عنوان URL المستضاف محليًا لموقعك الإلكتروني كما يعرضه سطر الأوامر (عادةً
localhost:5000
)، ولكن أضِفbigben
إلى عنوان URL، على النحو التالي:http://localhost:5000/bigben
كرِّر وظائفك ووظائفها لموقعك الإلكتروني. استخدِم محاكيات Firebase لاختبار هذه النُسخ.
طريقة عمل region
ضمن العنصر function
في حال حذف
region
من كتلةfunction
في ملفhosting.rewrites
الإعدادات، تحاول وحدة تحكم Firebase لخط الأوامر رصد المنطقة تلقائيًا من رمز المصدر للدالة، والذي يكون تلقائيًاus-central1
في حال عدم تحديده. إذا لم يكن رمز المصدر للدالة متاحًا، يحاول CLI رصد المنطقة من الدالة المنشورة. إذا كانت الدالة متوفّرة في مناطق متعدّدة، تتطلّب واجهة برمجة التطبيقات تحديدregion
في ملفhosting.rewrites
الإعدادات.
آلية عمل
pinTag
ضمن العنصر function
لا تتوفّر ميزة
pinTag
إلا في Cloud Functions for Firebase (الجيل الثاني). باستخدام هذه الميزة، يمكنك التأكّد من أنّ كل وظيفة لإنشاء المحتوى الديناميكي لموقعك الإلكتروني تتم مزامنتها مع موارد Hosting الثابتة وإعدادات Hosting. تتيح لك هذه الميزة أيضًا معاينة عمليات إعادة الصياغة لوظائف على Hosting قنوات المعاينة.إذا أضفت
"pinTag": true
إلى كتلةfunction
منhosting.rewrites
الإعداد، سيتم نشر الدالة "مُثبَّت" مع موارد Hosting الثابتة وإعداداتها، حتى عند تشغيل. في حال إعادة أحد إصدارات موقعك الإلكتروني إلى حالته السابقة، تتم أيضًا إعادة الدالة "مُثبَّت" إلى حالتها السابقة.
firebase deploy --only hosting تعتمد هذه الميزة على علامات Cloud Run، التي يبلغ الحدّ الأقصى لها 1,000 علامة لكل خدمة و2,000 علامة لكل منطقة. ويعني ذلك أنّه بعد إجراء مئات عمليات النشر، قد تتوقف الإصدارات الأقدم من الموقع الإلكتروني عن العمل.
للحصول على أفضل أداء، ضَع وظائفك بالقرب من Hosting من خلال اختيار إحدى المناطق التالية:
us-west1
us-central1
us-east1
europe-west1
asia-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
استخدام إطار عمل ويب
يمكنك استخدام إطارات عمل الويب، مثل 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
كواجهة برمجة تطبيقات بتنسيق 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 على نقاط النهاية.
ثبِّت الوسيط
cors
من خلال تنفيذ الأمر التالي:npm install --save cors
افتح ملف
/functions/index.js
، ثم أضِفcors
إلى تطبيق Express.js، على النحو التالي:const cors = require('cors')({origin: true}); app.use(cors);
انتقِل إلى مستندات Cloud Functions للاطّلاع على مزيد من المعلومات عن استخدام Firebase مع تطبيقات Express ووحدات الوسيط.
الخطوات التالية
إعداد ميزة التخزين المؤقّت للمحتوى الديناميكي على شبكة توصيل محتوى عالمية
التفاعل مع خدمات Firebase الأخرى باستخدام حزمة تطوير البرامج (SDK) لإدارة Firebase
راجِع الأسعار و الحصص والحدود في Cloud Functions.