إعداد بيئة Node.js
قبل أن تبدأ في بناء تطبيقات Node.js، تحتاج إلى إعداد بيئة التطوير الخاصة بك. في هذا الدرس، سنشرح كيفية تثبيت Node.js، وفهم npm (مدير حزم Node)، وإعداد مشروعك الأول، وتعلم الأدوات الأساسية التي ستجعل سير عمل التطوير الخاص بك أكثر كفاءة.
تثبيت Node.js
هناك عدة طرق لتثبيت Node.js على نظامك. سنغطي الطرق الأكثر شيوعًا لأنظمة التشغيل المختلفة.
الطريقة 1: المثبت الرسمي (موصى به للمبتدئين)
أبسط طريقة لتثبيت Node.js هي من خلال المثبت الرسمي:
- قم بزيارة nodejs.org
- قم بتنزيل إصدار LTS (الدعم طويل الأمد) للاستقرار
- قم بتشغيل المثبت واتبع معالج التثبيت
- يتضمن المثبت كلاً من Node.js و npm
LTS مقابل Current:
- LTS (الدعم طويل الأمد): مستقر، موصى به لتطبيقات الإنتاج. يتلقى التحديثات لمدة 30 شهرًا.
- Current: أحدث الميزات، ولكن قد تحتوي على تغييرات جذرية. جيد للتجريب.
التحقق من التثبيت
بعد التثبيت، تحقق من أن Node.js و npm مثبتان بشكل صحيح:
# تحقق من إصدار Node.js
node --version
# الإخراج: v20.11.0 (أو الإصدار المثبت لديك)
# تحقق من إصدار npm
npm --version
# الإخراج: 10.2.4 (أو الإصدار المثبت لديك)
# تشغيل Node.js REPL (Read-Eval-Print Loop)
node
> console.log('مرحبًا Node.js!');
مرحبًا Node.js!
> .exit
الطريقة 2: استخدام NVM (مدير إصدارات Node)
يسمح لك NVM بتثبيت وإدارة إصدارات Node.js متعددة على نفس الجهاز. هذا مفيد للغاية عند العمل على مشاريع مختلفة تتطلب إصدارات Node.js مختلفة.
لماذا تستخدم NVM؟
- التبديل بين إصدارات Node.js على الفور
- اختبار تطبيقك على إصدارات Node.js مختلفة
- تجنب مشاكل الأذونات مع حزم npm العامة
- أساسي لسير عمل التطوير الاحترافي
تثبيت NVM على macOS/Linux:
# تثبيت NVM باستخدام curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# أو باستخدام wget
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# إعادة تحميل تكوين الشل
source ~/.bashrc # أو ~/.zshrc لـ zsh
# التحقق من تثبيت NVM
nvm --version
تثبيت NVM على Windows:
# قم بتنزيل وتثبيت nvm-windows من:
# https://github.com/coreybutler/nvm-windows/releases
# بعد التثبيت، تحقق في PowerShell أو CMD
nvm version
استخدام أوامر NVM
# قائمة إصدارات Node.js المتاحة
nvm ls-remote # macOS/Linux
nvm list available # Windows
# تثبيت إصدار Node.js محدد
nvm install 20.11.0
# تثبيت أحدث إصدار LTS
nvm install --lts
# قائمة الإصدارات المثبتة
nvm ls
# التبديل إلى إصدار محدد
nvm use 20.11.0
# تعيين إصدار Node.js الافتراضي
nvm alias default 20.11.0
# التحقق من الإصدار الحالي
nvm current
تمرين: إدارة إصدارات Node.js متعددة
# تثبيت إصدارين مختلفين
nvm install 18.19.0
nvm install 20.11.0
# إنشاء ملف اختبار
echo "console.log(process.version);" > version-test.js
# الاختبار مع إصدارات مختلفة
nvm use 18.19.0
node version-test.js # الإخراج: v18.19.0
nvm use 20.11.0
node version-test.js # الإخراج: v20.11.0
فهم npm (مدير حزم Node)
npm هو مدير الحزم الافتراضي لـ Node.js. يسمح لك بتثبيت وتحديث وإدارة الحزم الخارجية (المكتبات والأطر) لمشاريعك.
ما هو npm؟
- سجل الحزم: أكبر سجل برمجيات في العالم مع أكثر من 2 مليون حزمة
- أداة سطر الأوامر: يتم تثبيتها تلقائيًا مع Node.js
- مدير التبعيات: يدير تبعيات المشروع وإصداراتها
أوامر npm الأساسية
# تهيئة مشروع Node.js جديد
npm init # إعداد تفاعلي
npm init -y # إعداد سريع بالإعدادات الافتراضية
# تثبيت الحزم
npm install express # تثبيت محليًا
npm install -g nodemon # تثبيت عالميًا
npm install lodash --save-dev # تثبيت كتبعية تطوير
# تثبيت جميع التبعيات من package.json
npm install
# تحديث الحزم
npm update # تحديث جميع الحزم
npm update express # تحديث حزمة محددة
# إلغاء تثبيت الحزم
npm uninstall express
npm uninstall -g nodemon
# قائمة الحزم المثبتة
npm list # تبعيات المشروع
npm list -g --depth=0 # الحزم العامة
# التحقق من الحزم القديمة
npm outdated
# تشغيل السكريبتات المحددة في package.json
npm run start
npm run test
npm run build
التثبيت العالمي مقابل المحلي:
- المحلي: يتم تثبيته في مجلد
node_modules الخاص بالمشروع. يُستخدم لتبعيات المشروع.
- العالمي: يتم تثبيته على مستوى النظام. استخدمه بحذر، بشكل رئيسي لأدوات CLI مثل nodemon، typescript، create-react-app.
فهم package.json
ملف package.json هو قلب أي مشروع Node.js. يحتوي على بيانات وصفية حول مشروعك ويدير التبعيات.
إنشاء package.json
# الإنشاء التفاعلي
npm init
# أسئلة العينة:
# package name: (my-project)
# version: (1.0.0)
# description: مشروع Node.js الرائع الخاص بي
# entry point: (index.js)
# test command: jest
# git repository: https://github.com/username/my-project
# keywords: nodejs, express, api
# author: اسمك
# license: (ISC) MIT
هيكل package.json النموذجي
{
"name": "my-nodejs-project",
"version": "1.0.0",
"description": "تطبيق Node.js نموذجي",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest",
"build": "webpack --mode production"
},
"keywords": ["nodejs", "express", "api"],
"author": "اسمك <your.email@example.com>",
"license": "MIT",
"dependencies": {
"express": "^4.18.2",
"dotenv": "^16.4.1"
},
"devDependencies": {
"nodemon": "^3.0.3",
"jest": "^29.7.0"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
}
}
فهم التبعيات
أنواع التبعيات:
- dependencies: الحزم المطلوبة للإنتاج (مثل express، mongoose)
- devDependencies: الحزم المطلوبة فقط أثناء التطوير (مثل أدوات الاختبار، bundlers)
- peerDependencies: الحزم التي تتوقع حزمتك أن يمتلكها المستهلك
- optionalDependencies: الحزم التي لن تفشل التثبيت إذا فشلت
الإصدار الدلالي (SemVer)
يستخدم npm الإصدار الدلالي لإصدارات الحزم: MAJOR.MINOR.PATCH
// تنسيق الإصدار: MAJOR.MINOR.PATCH
"express": "4.18.2"
// ^ ^ ^
// | | └─ التصحيح: إصلاحات الأخطاء (4.18.2 → 4.18.3)
// | └───── الثانوي: ميزات جديدة، متوافق مع الإصدارات السابقة (4.18.x → 4.19.0)
// └──────── الرئيسي: تغييرات جذرية (4.x.x → 5.0.0)
// رموز نطاق الإصدار:
"express": "^4.18.2" // تثبيت 4.x.x (يسمح بتحديثات ثانوية وتصحيحات)
"lodash": "~4.17.21" // تثبيت 4.17.x (يسمح بتحديثات التصحيح فقط)
"axios": "1.6.5" // تثبيت 1.6.5 بالضبط
"jest": "*" // تثبيت أحدث إصدار (غير موصى به)
"react": ">=18.0.0" // تثبيت 18.0.0 أو أعلى
أفضل ممارسة: استخدم ^ للتبعيات للحصول على إصلاحات الأخطاء والميزات الجديدة تلقائيًا، ولكن كن حذرًا مع تحديثات الإصدار الرئيسية لأنها قد تحتوي على تغييرات جذرية.
سكريبتات npm
تسمح لك سكريبتات npm بأتمتة المهام الشائعة في سير عمل التطوير الخاص بك.
{
"scripts": {
// بدء خادم الإنتاج
"start": "node server.js",
// التطوير مع إعادة التشغيل التلقائي
"dev": "nodemon server.js",
// تشغيل الاختبارات
"test": "jest --coverage",
"test:watch": "jest --watch",
// Linting
"lint": "eslint .",
"lint:fix": "eslint . --fix",
// البناء للإنتاج
"build": "webpack --mode production",
// ترحيلات قاعدة البيانات
"migrate": "node migrate.js",
// سكريبتات مخصصة
"seed": "node database/seed.js",
"deploy": "npm run build && npm run migrate"
}
}
تشغيل سكريبتات npm:
# سكريبتات خاصة (لا تحتاج إلى 'run')
npm start
npm test
# سكريبتات مخصصة (تتطلب 'run')
npm run dev
npm run build
npm run lint
# تمرير الوسائط إلى السكريبتات
npm run dev -- --port=4000
npm test -- --verbose
إعداد مشروع Node.js الأول الخاص بك
دعنا ننشئ مشروع Node.js كامل من الصفر:
# الخطوة 1: إنشاء دليل المشروع
mkdir my-first-nodejs-app
cd my-first-nodejs-app
# الخطوة 2: تهيئة npm
npm init -y
# الخطوة 3: إنشاء هيكل المشروع
mkdir src
touch src/index.js
touch .gitignore
# الخطوة 4: تثبيت التبعيات
npm install express
npm install --save-dev nodemon
# الخطوة 5: إنشاء ملف .gitignore
echo "node_modules/" >> .gitignore
echo ".env" >> .gitignore
echo "*.log" >> .gitignore
إنشاء خادمك الأول (src/index.js)
// src/index.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
// Middleware
app.use(express.json());
// المسارات
app.get('/', (req, res) => {
res.json({
message: 'مرحبًا بك في تطبيق Node.js الخاص بي!',
timestamp: new Date().toISOString()
});
});
app.get('/api/hello/:name', (req, res) => {
const { name } = req.params;
res.json({
greeting: `مرحبًا، ${name}!`,
version: '1.0.0'
});
});
// بدء الخادم
app.listen(PORT, () => {
console.log(`الخادم يعمل على http://localhost:${PORT}`);
});
تحديث سكريبتات package.json
{
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js"
}
}
تشغيل تطبيقك
# وضع التطوير (إعادة التشغيل التلقائي عند تغيير الملفات)
npm run dev
# وضع الإنتاج
npm start
# اختبار نقاط النهاية:
# افتح المتصفح: http://localhost:3000
# أو استخدم curl:
curl http://localhost:3000
curl http://localhost:3000/api/hello/Node
أدوات التطوير الأساسية
1. Nodemon - إعادة تشغيل الخادم تلقائيًا
# تثبيت nodemon
npm install --save-dev nodemon
# إنشاء nodemon.json للتكوين
{
"watch": ["src"],
"ext": "js,json",
"ignore": ["src/**/*.test.js"],
"exec": "node src/index.js"
}
# الاستخدام في package.json
"dev": "nodemon src/index.js"
2. dotenv - متغيرات البيئة
# تثبيت dotenv
npm install dotenv
# إنشاء ملف .env
PORT=3000
DATABASE_URL=mongodb://localhost:27017/myapp
API_KEY=your-secret-api-key
NODE_ENV=development
# التحميل في تطبيقك
require('dotenv').config();
const PORT = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;
الأمان: لا تقم أبدًا بإيداع ملفات .env في نظام التحكم في الإصدار! أضفها دائمًا إلى .gitignore.
3. ESLint - فحص الكود
# تثبيت ESLint
npm install --save-dev eslint
# تهيئة ESLint
npx eslint --init
# تشغيل ESLint
npm run lint
# إصلاح المشكلات تلقائيًا
npm run lint:fix
فهم node_modules
يحتوي مجلد node_modules على جميع الحزم المثبتة وتبعياتها.
حقائق مهمة:
- يمكن أن ينمو بشكل كبير جدًا (مئات ميجابايت)
- يجب ألا يتم إيداعه أبدًا في نظام التحكم في الإصدار
- يمكن إعادة إنشائه باستخدام
npm install
- يحتوي على تبعيات متداخلة (تبعيات التبعيات)
package-lock.json
يقفل هذا الملف الإصدارات الدقيقة لجميع التبعيات والتبعيات الفرعية:
- يضمن عمليات تثبيت متسقة عبر بيئات مختلفة
- يحسّن سرعة التثبيت
- يجب إيداعه في نظام التحكم في الإصدار
- يتم إنشاؤه تلقائيًا بواسطة npm
تمرين إعداد المشروع الكامل
أنشئ مشروع API Node.js كامل بالمتطلبات التالية:
- تهيئة مشروع جديد باستخدام npm
- تثبيت express و dotenv كتبعيات
- تثبيت nodemon كتبعية تطوير
- إنشاء ملف
.env مع متغيرات PORT و APP_NAME
- إنشاء خادم Express بنقاط النهاية التالية:
- GET / - يعيد رسالة ترحيب مع اسم التطبيق من .env
- GET /health - يعيد حالة صحة الخادم
- POST /api/echo - يعيد نص الطلب
- إضافة سكريبتات npm للتطوير والإنتاج
- إنشاء ملف .gitignore مناسب
- اختبار جميع نقاط النهاية
استكشاف المشكلات الشائعة وإصلاحها
المشكلة 1: أخطاء أذونات npm (macOS/Linux)
# المشكلة: أخطاء EACCES عند تثبيت الحزم العامة
# الحل: استخدم nvm (موصى به) أو إصلاح أذونات npm
# إصلاح أذونات npm (إذا لم تستخدم nvm)
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
المشكلة 2: أخطاء الوحدة غير موجودة
# المشكلة: لا يمكن العثور على الوحدة 'express'
# الحل: تثبيت التبعيات المفقودة
npm install # تثبيت جميع التبعيات من package.json
# أو
npm install express # تثبيت حزمة محددة
المشكلة 3: المنفذ قيد الاستخدام بالفعل
# المشكلة: Error: listen EADDRINUSE :::3000
# الحل: قتل العملية التي تستخدم المنفذ
# العثور على العملية التي تستخدم المنفذ 3000
lsof -i :3000 # macOS/Linux
netstat -ano | findstr :3000 # Windows
# قتل العملية
kill -9 <PID> # macOS/Linux
taskkill /PID <PID> /F # Windows
الملخص
في هذا الدرس، تعلمت:
- كيفية تثبيت Node.js باستخدام المثبت الرسمي أو NVM
- يسمح NVM بإدارة إصدارات Node.js متعددة
- npm هو مدير الحزم لتثبيت وإدارة التبعيات
- يحتوي package.json على بيانات وصفية للمشروع والتبعيات
- سكريبتات npm تؤتمت المهام التطويرية الشائعة
- الأدوات الأساسية: nodemon، dotenv، ESLint
- كيفية إنشاء وتشغيل مشروع Node.js الأول الخاص بك
في الدرس التالي، سنستكشف وحدات Node.js الأساسية ونتعلم كيفية العمل مع نظام الملفات وخوادم HTTP والمزيد!