ربط تطبيقك وبدء إنشاء النماذج الأولية


قبل البدء في استخدام Firebase Local Emulator Suite، تأكَّد من إنشاء مشروع Firebase، وإعداد بيئة التطوير، واختيار حِزم تطوير البرامج (SDK) لمنصّة Firebase وتثبيتها على منصّتك وفقًا لمواضيع بدء استخدام Firebase لمنصّتك: أجهزة Apple، Android أو الويب.

النموذج الأوّلي والاختبار

تحتوي Local Emulator Suite على عدة محاكيات منتجات، كما هو موضّح في مقدّمة عن Firebase Local Emulator Suite. يمكنك إنشاء نموذج أوّلي واختباره باستخدام محاكيات فردية بالإضافة إلى مجموعات من المحاكيات، حسب ما تراه مناسبًا، بما يتوافق مع منتجات Firebase التي تستخدمها في مرحلة الإنتاج.

التفاعل بين محاكي قاعدة بيانات Firebase ومحاكي الدوال
قاعدة البيانات وCloud Functions محاكيات كجزء من مجموعة أدوات المحاكاة Local Emulator Suite.

بالنسبة إلى هذا الموضوع، لتقديم سير عمل Local Emulator Suite، لنفترض أنّك تعمل على تطبيق يستخدم مجموعة نموذجية من المنتجات: قاعدة بيانات Firebase ودوال Cloud يتم تشغيلها من خلال عمليات على قاعدة البيانات هذه.

بعد إعداد مشروع Firebase محليًا، ستتضمّن عادةً دورة التطوير باستخدام Local Emulator Suite ثلاث خطوات:

  1. إنشاء نموذج أوّلي للميزات بشكل تفاعلي باستخدام المحاكيات وEmulator Suite UI.

  2. إذا كنت تستخدم محاكي قاعدة بيانات أو المحاكي Cloud Functions، عليك تنفيذ خطوة لمرة واحدة لربط تطبيقك بالمحاكيات.

  3. أتمِتة اختباراتك باستخدام المحاكيات والبرامج النصية المخصّصة.

إعداد مشروع Firebase محليًا

تأكَّد من تثبيت واجهة سطر الأوامر أو التحديث إلى أحدث إصدار منها.

curl -sL firebase.tools | bash

إذا لم يسبق لك ذلك، عليك إعداد دليل العمل الحالي كمشروع Firebase، باتّباع التعليمات التي تظهر على الشاشة لتحديد أنّك تستخدم Cloud Functions و إما Cloud Firestore أو Realtime Database:

firebase init

سيحتوي دليل مشروعك الآن على ملفات إعداد Firebase، و Firebase Security Rules تعريف لقاعدة البيانات، ودليل functions يحتوي على رمز دوال Cloud، وملفات دعم أخرى.

إنشاء نموذج أوّلي بشكل تفاعلي

Local Emulator Suite تم تصميمها لكي تتيح لك إنشاء نموذج أوّلي سريع للميزات الجديدة، وتُعدّ واجهة المستخدم المضمّنة في المجموعة إحدى أكثر أدوات إنشاء النماذج الأولية فائدةً. إنّها تشبه إلى حدّ ما تشغيل وحدة تحكم Firebase محليًا.

باستخدام Emulator Suite UI، يمكنك تكرار تصميم قاعدة بيانات، وتجربة تدفقات بيانات مختلفة تتضمّن دوال Cloud، وتقييم تغييرات قواعد الأمان، والاطّلاع على السجلات للتأكّد من أداء خدماتك للواجهة الخلفية، وغير ذلك. بعد ذلك، إذا أردت البدء من جديد، ما عليك سوى محو قاعدة بياناتك والبدء من جديد بفكرة تصميم جديدة.

تتوفّر كل هذه الميزات عند بدء Local Emulator Suite باستخدام:

firebase emulators:start

لإنشاء نموذج أوّلي لتطبيقنا الافتراضي، لنعدّ ونختبر دالة أساسية على السحابة الإلكترونية لتعديل إدخالات النصوص في قاعدة بيانات، وننشئ قاعدة البيانات هذه ونملأها في الـ Emulator Suite UI لتشغيلها.

  1. أنشئ دالة على السحابة الإلكترونية يتم تشغيلها من خلال عمليات الكتابة في قاعدة البيانات عن طريق تعديل الملف functions/index.js في دليل مشروعك. استبدِل محتوى الملف الحالي بالمقتطف التالي. تستمع هذه الدالة إلى التغييرات التي تطرأ على المستندات في مجموعة messages، وتحوِّل محتوى الحقل original للمستند إلى أحرف كبيرة، وتخزِّن النتيجة في الحقل uppercase للمستند.
  2.   const functions = require('firebase-functions/v1');
    
      exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
          .onCreate((snap, context) => {
            const original = snap.data().original;
            console.log('Uppercasing', context.params.documentId, original);
            const uppercase = original.toUpperCase();
            return snap.ref.set({uppercase}, {merge: true});
          });
      
  3. شغِّل Local Emulator Suite باستخدام firebase emulators:start. يبدأ تشغيل محاكيات Cloud Functions وقاعدة البيانات ، ويتم إعدادها تلقائيًا للتعاون معًا.
  4. اطّلِع على واجهة المستخدم في متصفّحك على http://localhost:4000. المنفذ 4000 هو المنفذ التلقائي لواجهة المستخدم، ولكن اطّلِع على رسائل المحطة الطرفية التي تعرضها واجهة سطر الأوامر Firebase. اطّلِع على حالة المحاكيات المتاحة. في حالتنا، سيتم تشغيل محاكيات Cloud Functions وCloud Firestore.
    صورتي
  5. في واجهة المستخدم، ضمن علامة التبويب Firestore > البيانات، انقر على بدء المجموعة واتّبِع التعليمات لإنشاء مستند جديد في مجموعة messages، مع اسم الحقل original والقيمة test. يؤدي ذلك إلى تشغيل دالة السحابة الإلكترونية. لاحظ ظهور حقل جديد uppercase بعد فترة قصيرة، وتم ملؤه بالسلسلة "TEST".
    صورتي صورتي
  6. في علامة التبويب Firestore > الطلبات، اطّلِع على الطلبات المقدّمة إلى قاعدة البيانات المحاكاة، بما في ذلك جميع التقييمات Firebase Security Rules التي تم إجراؤها كجزء من تلبية هذه الطلبات.
  7. اطّلِع على علامة التبويب السجلات للتأكّد من أنّ الدالة لم تواجه أي أخطاء أثناء تعديل قاعدة البيانات.

يمكنك التكرار بسهولة بين رمز دالة السحابة الإلكترونية وعمليات التعديل التفاعلية لقاعدة البيانات إلى أن تحصل على تدفق البيانات الذي تبحث عنه، بدون تعديل رمز الوصول إلى قاعدة البيانات داخل التطبيق، وإعادة تجميع مجموعات الاختبار وإعادة تشغيلها.

ربط تطبيقك بالمحاكيات

عند إحراز تقدّم جيد في إنشاء النموذج الأوّلي بشكل تفاعلي والاستقرار على تصميم، ستكون مستعدًا لإضافة رمز الوصول إلى قاعدة البيانات إلى تطبيقك باستخدام حزمة SDK المناسبة. ستستمر في استخدام علامة تبويب قاعدة البيانات، وبالنسبة إلى الدوال، علامة التبويب السجلات في Emulator Suite UI للتأكّد من أنّ سلوك تطبيقك صحيح.

تذكَّر أنّ Local Emulator Suite هي أداة تطوير محلية. لن تؤدي عمليات الكتابة في قواعد بياناتك في مرحلة الإنتاج إلى تشغيل الدوال التي تنشئ نموذجًا أوّليًا لها محليًا.

للتبديل إلى كتابة تطبيقك في قاعدة البيانات، عليك توجيه فئات الاختبار أو الإعداد داخل التطبيق إلى Cloud Firestore المحاكي.

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

أتمِتة اختباراتك باستخدام البرامج النصية المخصّصة

الآن، لننتقل إلى الخطوة الأخيرة في سير العمل العام. بعد إنشاء نموذج أوّلي للميزة داخل التطبيق وبدايتها واعدة على جميع منصّاتك، يمكنك الانتقال إلى التنفيذ النهائي والاختبار. بالنسبة إلى اختبارات الوحدات وسير عمل التكامل المستمر، يمكنك بدء المحاكيات وتشغيل الاختبارات المبرمَجة وإيقاف المحاكيات في عملية استدعاء واحدة باستخدام الأمر exec:

firebase emulators:exec "./testdir/test.sh"

استكشاف المحاكيات الفردية بمزيد من التفصيل

بعد أن اطّلعت على شكل سير العمل الأساسي من جهة العميل، يمكنك متابعة التفاصيل حول المحاكيات الفردية في المجموعة، بما في ذلك كيفية استخدامها لتطوير التطبيقات من جهة الخادم:

الخطوات التالية

احرص على قراءة المواضيع المرتبطة بالمحاكيات المحدّدة المرتبطة أعلاه. بعد ذلك: