📖 ما هو Node.js ولماذا يُستخدم؟
Node.js هو بيئة تشغيل (Runtime Environment) تتيح تشغيل JavaScript خارج المتصفح — على السيرفر. طوره Ryan Dahl عام 2009 بناءً على محرك V8 الخاص بـ Google Chrome.
💡 لماذا Node.js ثوري؟
قبل Node.js، JavaScript كانت لغة متصفح فقط. لو أردت بناء Backend، اضطررت لتعلم PHP أو Python أو Java. اليوم، بـ JavaScript واحدة يمكنك بناء Full-Stack Application كاملة — Frontend وBackend وقاعدة بيانات.
مميزات Node.js الرئيسية
- 🚀 أداء عالي: مبني على محرك V8 المُحسّن من Google
- ⚡ غير متزامن (Asynchronous): يتعامل مع آلاف الطلبات في نفس الوقت بدون توقف
- 📦 npm: أكبر مستودع حزم في العالم (2+ مليون حزمة)
- 🔄 JavaScript واحدة: نفس اللغة في Frontend وBackend
- 💬 Real-time: مثالي للدردشة والألعاب المتعددة اللاعبين
⚖️ Node.js مقابل لغات Backend الأخرى
| المعيار |
Node.js |
PHP |
Python |
Java |
| اللغة |
JavaScript |
PHP |
Python |
Java |
| النموذج |
غير متزامن |
متزامن |
متزامن/غير متزامن |
متزامن |
| السرعة |
⚡ سريع جداً |
متوسط |
متوسط |
⚡ سريع |
| الحزم |
2+ مليون (npm) |
Packagist |
PyPI |
Maven |
| أفضل استخدام |
APIs, Real-time, I/O كثيف |
مواقع تقليدية |
AI, Data Science |
Enterprise, Banking |
⚠️ متى لا تستخدم Node.js؟
Node.js ليس مثالياً للمهام الحسابية الثقيلة (CPU-intensive) مثل معالجة الصور أو الفيديو. في هذه الحالات، استخدم Python أو Go.
🔧 تثبيت Node.js والتحقق منه
يمكنك تثبيت Node.js من الموقع الرسمي nodejs.org. اختر النسخة LTS (Long Term Support) للاستقرار:
node -v
npm -v
node app.js
node
📝 أول تطبيق Node.js: خادم HTTP بسيط
باستخدام الوحدة المدمجة http، يمكنك إنشاء خادم ويب في 10 أسطر:
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end(`
<!DOCTYPE html>
<html>
<head><title>Node.js Server</title></head>
<body>
<h1>مرحباً من Node.js! 🚀</h1>
<p>الوقت: ${new Date().toLocaleString('ar-EG')}</p>
</body>
</html>
`);
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`✅ الخادم يعمل على http://localhost:${PORT}`);
});
✅ اختبر بنفسك:
- احفظ الكود في ملف
app.js
- شغّل:
node app.js
- افتح المتصفح على
http://localhost:3000
- سترى صفحة HTML تُرسلها Node.js!
📦 نظام الوحدات (Modules) في Node.js
Node.js يستخدم نظام CommonJS للوحدات. كل ملف JavaScript يعتبر وحدة مستقلة:
function add(a, b) {
return a + b;
}
function multiply(a, b) {
return a * b;
}
module.exports = { add, multiply };
const math = require('./math');
console.log(math.add(5, 3));
console.log(math.multiply(4, 7));
const { add, multiply } = require('./math');
الوحدات المدمجة في Node.js
| الوحدة |
الاستخدام |
مثال |
http | إنشاء خوادم ويب | require('http') |
fs | قراءة/كتابة الملفات | require('fs') |
path | التعامل مع مسارات الملفات | require('path') |
os | معلومات نظام التشغيل | require('os') |
events | إدارة الأحداث | require('events') |
📦 npm - مدير الحزم الأكبر في العالم
npm (Node Package Manager) هو أكبر مستودع برمجيات مفتوحة المصدر في العالم. يتيح لك تثبيت مكتبات جاهزة بأمر واحد:
npm init -y
npm install express
npm install nodemon --save-dev
npm install
npm start
npm run dev
npm test
npm uninstall express
💡 ملف package.json:
هذا الملف هو "جواز سفر" مشروعك. يحتوي على اسم المشروع، الإصدار، المؤلف، والحزم المُعتمدة. لا تحذفه أبداً! ولا تُرسل مجلد node_modules لـ Git — استخدم .gitignore.
🚀 Express.js - إطار العمل الأشهر
Express.js هو إطار عمل ويب minimalist لـ Node.js. يُبسّط إنشاء الخوادم وإدارة المسارات بشكل كبير:
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.json({ message: 'مرحباً من Express!' });
});
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
res.json({ userId, message: `معلومات المستخدم ${userId}` });
});
app.get('/search', (req, res) => {
const query = req.query.q;
res.json({ query, results: ["نتيجة 1", "نتيجة 2"] });
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`✅ Express يعمل على http://localhost:${PORT}`);
});
🛣️ Routing: التعامل مع المسارات
Express يجعل إدارة المسارات سهلة ومنظمة:
app.get('/api/products', (req, res) => {
res.json(products);
});
app.post('/api/products', (req, res) => {
const newProduct = req.body;
products.push(newProduct);
res.status(201).json(newProduct);
});
app.put('/api/products/:id', (req, res) => {
const id = parseInt(req.params.id);
const updated = req.body;
res.json({ message: `تم تحديث المنتج ${id}` });
});
app.delete('/api/products/:id', (req, res) => {
const id = parseInt(req.params.id);
res.status(204).send();
});
| الطريقة |
الوظيفة |
مثال |
GET | جلب بيانات | عرض قائمة منتجات |
POST | إنشاء بيانات | إضافة منتج جديد |
PUT | تحديث كامل | تعديل كل بيانات المنتج |
DELETE | حذف بيانات | حذف منتج |
🔧 Middleware - البرمجيات الوسيطة
Middleware هي دوال تُنفّذ بين استقبال الطلب وإرسال الاستجابة. تُستخدم للتحقق، التسجيل، ومعالجة البيانات:
app.use((req, res, next) => {
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
next();
});
function authMiddleware(req, res, next) {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).json({ error: 'غير مصرح' });
}
next();
}
app.get('/admin', authMiddleware, (req, res) => {
res.json({ message: 'لوحة التحكم' });
});
⚡ البرمجة غير المتزامنة في Node.js
سر Node.js الحقيقي يكمن في نموذجه غير المتزامن. بدلاً من انتظار كل عملية، يستمر في استقبال طلبات جديدة:
const fs = require('fs').promises;
async function readFileAsync() {
try {
const data = await fs.readFile('data.txt', 'utf8');
console.log(data);
return data;
} catch (err) {
console.error('خطأ:', err.message);
}
}
app.get('/data', async (req, res) => {
const data = await readFileAsync();
res.json({ data });
});
💼 أمثلة واقعية من التطبيقات
1. API بسيط لقائمة مهام (To-Do API)
const express = require('express');
const app = express();
app.use(express.json());
let todos = [
{ id: 1, text: "تعلم Node.js", done: false },
{ id: 2, text: "بناء API", done: false }
];
app.get('/api/todos', (req, res) => {
res.json(todos);
});
app.post('/api/todos', (req, res) => {
const todo = {
id: Date.now(),
text: req.body.text,
done: false
};
todos.push(todo);
res.status(201).json(todo);
});
app.put('/api/todos/:id', (req, res) => {
const todo = todos.find(t => t.id === parseInt(req.params.id));
if (todo) {
todo.done = req.body.done;
res.json(todo);
} else {
res.status(404).json({ error: 'غير موجود' });
}
});
app.listen(3000);
2. تسجيل دخول بسيط
const users = [
{ username: "admin", password: "123456" }
];
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
res.json({
success: true,
message: "تم تسجيل الدخول!",
token: "fake-jwt-token-123"
});
} else {
res.status(401).json({
success: false,
message: "بيانات غير صحيحة"
});
}
});
🚀 الخطوة التالية: مشروع التخرج
في الدرس العاشر والأخير، ستبني مشروعاً كاملاً يجمع كل ما تعلمته:
- 🌐 Frontend: HTML, CSS, JavaScript
- ⚙️ Backend: Node.js + Express
- 💾 Database: MongoDB أو JSON files
- 🔐 Authentication: تسجيل دخول حقيقي