Node.js / الأساسي: بيئة تشغيل Node.js / الدرس 1
بيئة Node.js وأساسيات JavaScript
افهم ما يشغّل برنامج JavaScript على الخادم، واختر إصدارا مدعوما بوعي، واستخدم القيم والدوال دون الاعتماد على واجهات المتصفح.
في هذه الصفحة
أهداف الدرس
- اشرح المفاهيم والمفاضلات المتعلقة بموضوع «بيئة Node.js وأساسيات JavaScript».
- توقع المثالين وتحقق من مخرجاتهما وسلوك تنظيف الموارد فيهما.
- شخّص الإخفاقات الثلاثة الشائعة وطبق الحلول المشروحة على مدخلات مشابهة.
لبيئة التشغيل حدود
تشغّل Node.js لغة JavaScript خارج المتصفح. ينفذ محرك V8 اللغة، وتضيف Node إمكانات الملفات والعمليات والشبكات والمؤقتات. تحتوي صفحة الويب على document وwindow، أما عملية Node فلا تملك مستندا لتعديله تلقائيا. اسأل أولا عن البيئة التي توفر الواجهة المطلوبة. اكتب قواعد العمل في دوال عادية، وضع التعامل مع الملفات والشبكة عند أطراف البرنامج. يجعل هذا الفصل اختبار الحساب نفسه ممكنا دون تشغيل خادم، ويكشف الافتراضات المتعلقة بالبيئة قبل النشر.
اختيار بيئة التشغيل والتحقق منها
رُوجعت صفحة الإصدارات الرسمية في 2026-10-23: يظهر Node 24 وNode 22 بوصفهما LTS، وNode 26 بوصفه Current، وانتهى دعم Node 20. هذه معلومات مؤرخة وليست تسميات دائمة. اختر سلسلة مدعومة وثبّت أحدث تحديث أمني لها، وسجّل بيئة التشغيل الدقيقة محليا وفي التكامل المستمر. تستخدم الأمثلة ميزات مستقرة اختُبرت محليا على Node 22.23.3. احفظ كل مثال كامل بالاسم المعروض الذي ينتهي بـ .mjs، وشغّله بكتابة node ثم اسم الملف. قد توفر مديرات الإصدارات وحزم النظام ملفات تنفيذ مختلفة؛ لذا افحص node --version في الطرفية التي تستخدمها فعليا.
القيم والأسماء والتحويل الصريح
استخدم const عندما لا تريد إعادة إسناد الاسم، وlet عندما تتطلب الخوارزمية ذلك. يمكن تعديل خصائص كائن معرّف بـ const؛ فهي تحمي الربط بالاسم ولا تجمّد القيمة بعمق. تصل مدخلات الطرفية والبيئة نصوصا حتى إذا بدت أرقاما. تحوّل Number النص، وترفض Number.isFinite قيم NaN واللانهاية. ارفض النص الفارغ قبل التحويل إذا كان الفراغ لا يعني صفرا. فضّل المساواة الصارمة. تمنع هذه القرارات جمع النصوص بالخطأ، وتوقف الكميات غير الصالحة قبل التخزين أو بناء الاستجابة.
const rows = [{ active: true, quantity: 3 }, { active: false, quantity: 8 }, { active: true, quantity: 2 }];
const total = rows.filter(row => row.active).reduce((sum, row) => sum + row.quantity, 0);
console.log(total);
console.log(typeof process, typeof document);
5
object undefined
يجري الاختيار قبل الجمع؛ وتوفر Node الكائن process بينما يغيب document. السطران ثابتان عند تشغيل هذا الملف مستقلا.
الدوال والمجموعات توضّح العمل
ينبغي للدالة أن تستقبل القيم التي تحتاج إليها وأن تعيد نتيجة واضحة. تحوّل map كل عنصر، وتختار filter بعض العناصر، وتجمع reduce العناصر في نتيجة واحدة. يحدد إعطاء قيمة ابتدائية للمجمّع سلوك المصفوفة الفارغة أيضا. يختار المثال الأول العناصر النشطة قبل جمع كمياتها، ولا يعتمد الحساب على الطباعة أو حالة عامة قابلة للتغيير. يجعل المثال الثاني التحقق العددي صريحا ويلتقط الفشل المتوقع عند حدود البرنامج. اقرأ المدخلات وتوقع المخرجات ثم شغّل الملف؛ فهذه العادة تبني فهما للتنفيذ بدلا من الاعتماد على نسخ الصياغة.
function quantity(text) {
if (text.trim() === '') throw new Error('Quantity is required');
const value = Number(text);
if (!Number.isFinite(value) || value < 0) throw new Error('Invalid quantity');
return value;
}
console.log(quantity('12') + 3);
try { quantity('many'); } catch (error) { console.log(error.message); }
15
Invalid quantity
ينتج التحويل العدد 12 ولذلك يكون المجموع 15. يتحول النص غير العددي إلى NaN فيُرفض عمدا قبل استخدامه.
من سكربت إلى برنامج قابل للصيانة
شغّل سكربتا صغيرا حتى ينتهي قبل إضافة موارد طويلة العمر. تنتهي العملية عادة عندما لا يبقى عمل يحافظ على نشاطها، بينما يبقي الخادم المستمع أو المؤقت المتكرر العملية حية. تدل حالة الخروج صفر على النجاح، وتتيح الحالة غير الصفرية للطرفية والتكامل المستمر اكتشاف الفشل. تجنب فرض process.exit مباشرة بعد تسجيل غير متزامن أو تنظيف للموارد؛ فقد ينقطع العمل المعلّق. فضّل ضبط process.exitCode بعد معالجة الخطأ. ميّز بين أخطاء الصياغة والاستثناءات أثناء التشغيل والنتائج الحسابية الخاطئة؛ فلكل منها طريقة تحقيق مختلفة.
الأخطاء الشائعة وإصلاحها
ReferenceError: document is not defined
- لماذا يحدث؟
- شُغّلت شيفرة خاصة بمستند المتصفح داخل Node.
- كيف تصلحه؟
- انقل عمل المستند إلى المتصفح ومرر بيانات عادية إلى دوال الخادم.
- كيف تتجنب تكراره؟
- حدد بيئة التشغيل التي توفر كل واجهة قبل اختيارها.
تصبح النتيجة 123 بدلا من 15
- لماذا يحدث؟
- جُمعت مدخلات نصية مع رقم دون تحويل.
- كيف تصلحه؟
- حوّل المدخلات وتحقق منها قبل الحساب.
- كيف تتجنب تكراره؟
- اختبر النص العددي والفارغ وغير العددي كلّا على حدة.
تشغيل إصدار Node غير المقصود
- لماذا يحدث؟
- تعثر الطرفية على تثبيت آخر أولا.
- كيف تصلحه؟
- افحص node --version ومسار الملف التنفيذي ثم اختر إصدار المشروع.
- كيف تتجنب تكراره؟
- ثبّت الإصدارات وتحقق منها في التكامل المستمر وتعليمات إعداد المشروع.
اختبر فهمك
1. احسب مجموع القيم الموجبة في [4, -2, 7, 0] دون تعديل المصفوفة.
اعرض الحل المشروح
استخدم filter بالشرط value > 0 فتحصل على [4, 7]، ثم reduce بقيمة ابتدائية صفر. النتيجة 11. تحقق من بقاء أربعة عناصر في المصفوفة الأصلية، فلا ينبغي للتحويل أن يعدّل مدخلات يملكها المستدعي خفية.
2. حدد سلوك مدخلات الكمية "" و"0" و"Infinity".
اعرض الحل المشروح
ارفض النص الفارغ قبل Number، واقبل "0" بوصفه صفرا عدديا، وارفض "Infinity" بواسطة Number.isFinite. الترتيب مهم لأن Number("") تساوي صفرا. أعط كل حالة مرفوضة رسالة تحقق واضحة للمستخدم.
أهم ما تعلمته
- تشغّل Node.js لغة JavaScript خارج المتصفح.
- رُوجعت صفحة الإصدارات الرسمية في 2026-10-23: يظهر Node 24 وNode 22 بوصفهما LTS، وNode 26 بوصفه Current، وانتهى دعم Node 20.
- شغّل سكربتا صغيرا حتى ينتهي قبل إضافة موارد طويلة العمر.