مقدمة في 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');
});اختبر فهمك