Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

استخدام حِزم الوحدات مع Firebase

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

بدءًا من الإصدار 9 والإصدارات الأحدث ، تم تحسين Firebase JavaScript SDK للعمل مع ميزات التحسين الخاصة بحزم الوحدات النمطية لتقليل مقدار رمز Firebase المضمَّن في الإصدار النهائي.

import { initializeApp } from 'firebase/app';
import { getAuth, onAuthStateChanged, getRedirectResult } from 'firebase/auth';

const firebaseApp = initializeApp({ /* config */ });
const auth = getAuth(firebaseApp);
onAuthStateChanged(auth, user => { /* check status */ });

/**
 * getRedirectResult is unused and should not be included in the code base.
 * In addition, there are many other functions within firebase/auth that are
 * not imported and therefore should not be included as well.
 */

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

هناك العديد من حزم الوحدات عالية الجودة في نظام JavaScript البيئي. يركز هذا الدليل على تغطية استخدام Firebase مع webpack و Rollup و esbuild .

البدء

يتطلب هذا الدليل تثبيت npm في بيئة التطوير الخاصة بك. يتم استخدام npm لتثبيت وإدارة التبعيات (المكتبات). لتثبيت npm ، قم بتثبيت Node.js ، والذي يتضمن npm تلقائيًا.

يتم إعداد معظم المطورين بشكل صحيح بمجرد قيامهم بتثبيت Node.js. ومع ذلك ، هناك مشاكل شائعة يواجهها العديد من المطورين عند إعداد بيئتهم. إذا واجهت أي أخطاء ، فتأكد من أن بيئتك تحتوي على npm CLI وأن لديك الأذونات المناسبة التي تم إعدادها حتى لا تضطر إلى تثبيت الحزم كمسؤول باستخدام الأمر sudo .

package.json وتثبيت Firebase

بمجرد تثبيت npm ، ستحتاج إلى إنشاء ملف package.json في جذر مشروعك المحلي. قم بإنشاء هذا الملف باستخدام الأمر npm التالي:

npm init

سينقلك هذا عبر معالج لتوفير المعلومات المطلوبة. بمجرد إنشاء الملف سيبدو مشابهًا لما يلي:

{
  "name": "your-package-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {

  }
}

هذا الملف مسؤول عن العديد من الأشياء المختلفة. يعد هذا ملفًا مهمًا لتتعرف عليه إذا كنت تريد معرفة المزيد حول تجميع الوحدات النمطية وبناء كود JavaScript بشكل عام. الجزء المهم في هذا الدليل هو كائن "dependencies" . سيحتوي هذا الكائن على زوج قيم أساسي للمكتبة التي قمت بتثبيتها والإصدار الذي تستخدمه.

تتم إضافة التبعيات من خلال الأمر npm install أو npm i .

npm i firebase

عند تشغيل npm i firebase ، ستعمل عملية التثبيت على تحديث package.json لإدراج Firebase كعنصر تابع:

  "dependencies": {
    "firebase": "^9.0.0"
  },

المفتاح هو اسم المكتبة والقيمة هي الإصدار المراد استخدامه. قيمة الإصدار مرنة ويمكن أن تقبل مجموعة من القيم. يُعرف هذا باسم الإصدار الدلالي أو semver. لمعرفة المزيد حول semver ، راجع دليل npm حول الإصدارات الدلالية .

المصدر مقابل إنشاء المجلدات

تتم قراءة الكود الذي تكتبه ومعالجته بواسطة مجمع الوحدات النمطية ثم يتم إخراجه كملف جديد أو مجموعة ملفات. من المهم فصل هذين النوعين من الملفات. يُعرف الكود الذي تقرأه مجمعات الوحدات النمطية ومعالجتها باسم الكود "المصدر". تُعرف الملفات التي ينتجونها باسم الكود المبني أو "التوزيع" (التوزيع).

الإعداد الشائع في قواعد التعليمات البرمجية هو تخزين التعليمات البرمجية المصدر في مجلد يسمى src والرمز المدمج في مجلد يسمى dist .

- src
 |_ index.js
 |_ animations.js
 |_ datalist.js


- dist
 |_ bundle.js

في نموذج بنية الملف أعلاه ، ضع في اعتبارك أن index.js يستورد كلاً من animations.js و datalist.js . عندما تعالج وحدة تجميع الوحدات الكود المصدري ، فإنها ستنتج ملف bundle.js في مجلد dist . يعتبر bundle.js مجموعة من الملفات الموجودة في المجلد src وأي مكتبات يتم استيرادها أيضًا.

إذا كنت تستخدم أنظمة تحكم بالمصادر مثل Git ، فمن الشائع تجاهل مجلد dist عند تخزين هذا الرمز في المستودع الرئيسي.

نقاط الدخول

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

دعنا نعيد النظر في مثال بنية الملف السابق.

- src
 |_ index.js
 |_ animations.js
 |_ datalist.js


- dist
 |_ bundle.js
// src/index.js
import { animate } from './animations';
import { createList } from './datalist';

// This is not real code, but for example purposes only
const theList = createList('users/123/tasks');
theList.addEventListener('loaded', event => {
  animate(theList);
});

يعتبر ملف src/index.js نقطة الإدخال لأنه يبدأ استيراد جميع الأكواد المطلوبة للتطبيق. يتم استخدام ملف نقطة الإدخال هذا بواسطة حزم الوحدات لبدء عملية التجميع.

استخدام Firebase مع حزمة الويب

لا توجد تهيئة محددة مطلوبة لتطبيقات Firebase وحزمة الويب. يغطي هذا القسم تكوين حزمة الويب العامة .

الخطوة الأولى هي تثبيت webpack من npm كاعتماد للتطوير.

npm i webpack webpack-cli -D

أنشئ ملفًا في جذر مشروعك المحلي باسم webpack.config.js وأضف الكود التالي.

const path = require('path');

module.exports = {
  // The entry point file described above
  entry: './src/index.js',
  // The location of the build folder described above
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  // Optional and for development only. This provides the ability to
  // map the built code back to the original source format when debugging.
  devtool: 'eval-source-map',
};

ثم تأكد من تثبيت Firebase كعنصر تابع.

npm i firebase

ثم قم بتهيئة Firebase في قاعدة التعليمات البرمجية الخاصة بك. يقوم الكود التالي باستيراد وتهيئة Firebase في ملف نقطة إدخال ويستخدم Firestore Lite لتحميل مستند "city".

// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';

const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);

async function loadCity(name) {
  const cityDoc = doc(db, `cities/${name}`);
  const snapshot = await getDoc(cityDoc);
  return {
    id: snapshot.id,
    ...snapshot.data(),
  };
}

الخطوة التالية هي إضافة برنامج نصي npm لتشغيل webpack build. افتح ملف package.json وأضف زوج قيمة المفتاح التالي إلى كائن "scripts" .

  "scripts": {
    "build": "webpack --mode=development"
  },

لتشغيل حزمة الويب وإنشاء مجلد الإنشاء ، قم بتشغيل الأمر التالي.

npm run build

أخيرًا ، تحقق من مجلد إنشاء dist . يجب أن يحتوي على ملف يسمى bundle.js يحتوي على التطبيق المجمّع ورمز التبعية.

لمزيد من المعلومات حول تحسين webpack الخاص بك للإنتاج ، راجع وثائقهم الرسمية حول إعداد تكوين "الوضع" .

استخدام Firebase مع العرض الإجمالي

لا توجد تهيئة محددة مطلوبة لتطبيقات Firebase والتجميع. يغطي هذا القسم تكوين مجموعة عامة.

تتمثل الخطوة الأولى في تثبيت Rollup ومكوِّن إضافي يستخدم لتعيين الواردات إلى التبعيات المثبتة مع npm.

npm i rollup @rollup/plugin-node-resolve -D

قم بإنشاء ملف في جذر مشروعك المحلي باسم rollup.config.js وأضف الكود التالي.

import { nodeResolve } from '@rollup/plugin-node-resolve';

export default {
  // the entry point file described above
  input: 'src/index.js',
  // the output for the build folder described above
  output: {
    file: 'dist/bundle.js',
    // Optional and for development only. This provides the ability to
    // map the built code back to the original source format when debugging.
    sourcemap: 'inline',
    // Configure Rollup to convert your module code to a scoped function
    // that "immediate invokes". See the Rollup documentation for more
    // information: https://rollupjs.org/guide/en/#outputformat
    format: 'iife'
  },
  // Add the plugin to map import paths to dependencies
  // installed with npm
  plugins: [nodeResolve()]
};

ثم قم بتهيئة Firebase في قاعدة التعليمات البرمجية الخاصة بك. يقوم الكود التالي باستيراد وتهيئة Firebase في ملف نقطة إدخال ويستخدم Firestore Lite لتحميل مستند "city".

// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';

const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);

async function loadCity(name) {
  const cityDoc = doc(db, `cities/${name}`);
  const snapshot = await getDoc(cityDoc);
  return {
    id: snapshot.id,
    ...snapshot.data(),
  };
}

تتمثل الخطوة التالية في إضافة برنامج نصي npm لتشغيل إنشاء مجموعة التحديثات. افتح ملف package.json وأضف زوج قيمة المفتاح التالي إلى كائن "scripts" .

  "scripts": {
    "build": "rollup -c rollup.config.js"
  },

لتشغيل مجموعة التحديثات وإنشاء مجلد الإنشاء ، قم بتشغيل الأمر التالي.

npm run build

أخيرًا ، تحقق من مجلد إنشاء dist . يجب أن يحتوي على ملف يسمى bundle.js يحتوي على التطبيق المجمّع ورمز التبعية.

لمزيد من المعلومات حول تحسين إصدار Rollup للإنتاج ، راجع الوثائق الرسمية الخاصة بهم حول المكونات الإضافية لبناءات الإنتاج .

استخدام Firebase مع esbuild

لا توجد تهيئة محددة مطلوبة لتطبيقات Firebase و esbuild. يغطي هذا القسم تكوين esbuild العام.

تتمثل الخطوة الأولى في تثبيت esbuild كعامل تبعية للتطوير.

npm i esbuild -D

قم بإنشاء ملف في جذر مشروعك المحلي باسم esbuild.config.js وأضف الكود التالي.

require('esbuild').build({
  // the entry point file described above
  entryPoints: ['src/index.js'],
  // the build folder location described above
  outfile: 'dist/bundle.js',
  bundle: true,
  // Replace with the browser versions you need to target
  target: ['chrome60', 'firefox60', 'safari11', 'edge20'],
  // Optional and for development only. This provides the ability to
  // map the built code back to the original source format when debugging.
  sourcemap: 'inline',
}).catch(() => process.exit(1))

ثم قم بتهيئة Firebase في قاعدة التعليمات البرمجية الخاصة بك. يقوم الكود التالي باستيراد وتهيئة Firebase في ملف نقطة إدخال ويستخدم Firestore Lite لتحميل مستند "city".

// src/index.js
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, getDoc } from 'firebase/firestore/lite';

const firebaseApp = initializeApp({ /* config */ });
const db = getFirestore(firebaseApp);

async function loadCity(name) {
  const cityDoc = doc(db, `cities/${name}`);
  const snapshot = await getDoc(cityDoc);
  return {
    id: snapshot.id,
    ...snapshot.data(),
  };
}

الخطوة التالية هي إضافة برنامج نصي npm لتشغيل esbuild. افتح ملف package.json وأضف زوج قيمة المفتاح التالي إلى كائن "scripts" .

  "scripts": {
    "build": "node ./esbuild.config.js"
  },

أخيرًا ، تحقق من مجلد إنشاء dist . يجب أن يحتوي على ملف يسمى bundle.js يحتوي على التطبيق المجمّع ورمز التبعية.

لمزيد من المعلومات حول تحسين esbuild للإنتاج ، راجع الوثائق الرسمية الخاصة بالتصغير والتحسينات الأخرى .