طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 302 · من الفكرة إلى المنتج (٢): نظام حجز مواعيد
الدرس 8 · الوحدة 4: الجودة والتسليم

المحطّة ٨: النشر والتسليم

الخطوة الأخيرة: طبقتان تعملان على خادمٍ حقيقيّ، موثّقتان يشغّلهما غيرك. ⏱ نحو 22 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تنشر تطبيق React+Express من طبقتين.
  • تنقل الأسرار والعناوين إلى متغيّرات بيئة.
  • تضبط CORS وإعدادات الإنتاج الآمنة.
  • تجهّز توثيقًا يمكّن غيرك من تشغيل المنتج.

١نشر تطبيقٍ من طبقتين

مشروعنا طبقتان لهما طريقتا تشغيلٍ مختلفتان في التطوير: الواجهة على خادم Vite، والخادم على Node. عند النشر — كما تعلّمت في 242 — نحوّلهما إلى منتجٍ واحدٍ يعمل على خادمٍ حقيقيّ.

  1. ابنِ الواجهة: npm run build يُنتج ملفّات ثابتة (HTML/CSS/JS) في dist/.
  2. شغّل الخادم: node server.js على منفذٍ ثابت، ويقدّم الـ API تحت /api.
  3. اربطهما: إمّا أن يقدّم Express ملفّات dist/ نفسه، أو تُنشَر الواجهة على استضافةٍ ثابتةٍ والخادم على مزوّد Node.

٢إعدادات الإنتاج الحرجة

الإعدادفي التطويرفي الإنتاج
عنوان الـ APIlocalhost:3000متغيّر بيئةٍ VITE_API_URL
السرّ JWTنصٌّ ثابتمتغيّر بيئةٍ طويلٌ عشوائيّ، خارج الكود
CORSمفتوحٌ للتطويرمقصورٌ على أصل الواجهة فقط
الأخطاءمفصّلةٌ في الطرفيةرسالةٌ عامّةٌ للمستخدم، وتفصيلٌ في السجلّ
HTTPSاختياريّمطلوبٌ (الرموز تُرسَل عبر الشبكة)

٣CORS: لماذا قد تُرفَض طلبات واجهتك؟

حين تكون الواجهة على أصلٍ (origin) والخادم على آخر، يحجب المتصفّح الطلبات افتراضيًّا. الحلّ أن يأذن الخادم صراحةً لأصل الواجهة:

const cors = require('cors');app.use(cors({ origin: process.env.WEB_ORIGIN }));   // أصل الواجهة فقط، لا '*'

في التطوير يكفي وكيل Vite؛ في الإنتاج اضبط CORS بدقّةٍ على أصل واجهتك وحده — لا *، فذلك يفتح الـ API للجميع.

٤حزمة التسليم

حين يشغّل زميلٌ مشروعك من README وحده — واجهةً وخادمًا — فقد صار «منتجًا». هذا معنى «من الفكرة إلى المنتج».

توقّع وتحقّق

أين يوضع عنوان الـ API للإنتاج؟

ضبط CORS الصحيح في الإنتاج:

ماذا يُنتج npm run build؟

لماذا سرّ JWT خارج الكود؟

الخلاصة

تحدٍّ تصميمي: نشر نظام الحجز وتسليمه

تصميمي

انشر مشروعك (واجهةً وخادمًا) وجهّز حزمة تسليمٍ كاملة بحيث يشغّله زميلٌ من الصفر باتّباع توثيقك وحده.

المطلوب:
  • بناء الواجهة وتشغيل الخادم معًا.
  • نقل الأسرار والعناوين إلى متغيّرات بيئة.
  • ضبط CORS للإنتاج، وإخفاء تفاصيل الأخطاء.
  • README و .env.example ووثائق المحطّات.
☑ راجع عملك قبل التسليم:
💡 تلميح 1
في الواجهة استبدل العنوان الثابت بـ import.meta.env.VITE_API_URL.
💡 تلميح 2
جرّب README على مجلّدٍ نظيف: ثبّت، ابنِ، شغّل — إن عمل عندك عمل عند المقيّم.

🐞 لاحظت خطأً في هذا الدرس؟ أبلغني بالبريد

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس