Kodax

مقدمة في Node.js — Node.js و Express

مقدمة في Node.js

Node.js بيئة تشغّل JavaScript خارج المتصفح، مبنية على محرك V8 (نفس محرك Chrome). بها تكتب خوادم الويب وواجهات API وأدوات سطر الأوامر وسكربتات الأتمتة — باللغة نفسها التي تعرفها من الواجهة.

ما الذي يختلف عن المتصفح؟

| المتصفح | Node.js |

|---|---|

| window و document و DOM | غير موجودة |

| لا وصول للملفات (أمان) | fs للملفات، http للشبكة، process للنظام |

| fetch و localStorage | fetch موجود (Node 18+)، لا localStorage |

| يحمّله المستخدم | يعمل على خادمك: لا تثق بأي مدخل من العميل |

الفكرة الأساسية: لا تنتظر

أغلب عمل الخادم انتظار: قراءة قاعدة بيانات، ملف، طلب لخدمة أخرى. Node لا يجمّد البرنامج أثناء الانتظار؛ يسجّل "ماذا يفعل عند الانتهاء" ويخدم طلبات أخرى.

console.log("1) بداية");
setTimeout(() => console.log("3) بعد 0 ملّي ثانية — لكن بعد انتهاء الكود الحالي"), 0);
Promise.resolve().then(() => console.log("2.5) المهام الصغيرة (Promises) قبل المؤقتات"));
console.log("2) نهاية الكود المتزامن");

شغّله ولاحظ الترتيب: 1 ← 2 ← 2.5 ← 3.

حلقة الأحداث (Event Loop)

الكود المتزامن ← ينتهي
   ↓
مهام Promises (microtasks) ← كلها
   ↓
المؤقتات / I/O المنتهية / الأحداث (macrotasks) ← واحدة تلو الأخرى، ثم microtasks مجدداً

Node يعمل بخيط JavaScript واحد. لذلك:

- آلاف الاتصالات المتزامنة ممكنة لأن أغلبها ينتظر I/O.

- لكن حساب ثقيل متزامن (حلقة بمليار دورة، تشفير كبير متزامن) يجمّد الخادم لكل المستخدمين. استخدم النسخ غير المتزامنة من الدوال، أو worker_threads للحسابات الثقيلة.

متى تختار Node؟

- واجهات API وخوادم الوقت الحقيقي (دردشة، إشعارات) — ممتاز.

- فريق يعرف JavaScript ويريد لغة واحدة للواجهة والخلفية.

- أقل ملاءمة لحسابات CPU مكثفة (معالجة فيديو، تعلم آلة) — هناك لغات أنسب.

التشغيل

node --version          # يفضل إصدار LTS زوجي (20 أو 22)
node app.js             # تشغيل ملف
node --watch app.js     # يعيد التشغيل تلقائياً عند الحفظ (Node 18.11+)
node                    # وضع تفاعلي (REPL) للتجربة

تمرين

اكتب info.js يطبع إصدار Node (process.version)، ونظام التشغيل (process.platform)، والمجلد الحالي (process.cwd())، ثم توقّع ترتيب الطباعة في مثال حلقة الأحداث قبل تشغيله وتحقق.

// أول سيرفر HTTP بسيط
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.end('<h1>مرحباً بك في Node.js!</h1>');
});

server.listen(3000, () => {
  console.log('السيرفر يعمل على http://localhost:3000');
});
اختبر فهمك