Node.js و Express

إعداد بيئة Node.js

25 دقيقة الدرس 2 من 40

إعداد بيئة Node.js

قبل أن تبدأ في بناء تطبيقات Node.js، تحتاج إلى إعداد بيئة التطوير الخاصة بك. في هذا الدرس، سنشرح كيفية تثبيت Node.js، وفهم npm (مدير حزم Node)، وإعداد مشروعك الأول، وتعلم الأدوات الأساسية التي ستجعل سير عمل التطوير الخاص بك أكثر كفاءة.

تثبيت Node.js

هناك عدة طرق لتثبيت Node.js على نظامك. سنغطي الطرق الأكثر شيوعًا لأنظمة التشغيل المختلفة.

الطريقة 1: المثبت الرسمي (موصى به للمبتدئين)

أبسط طريقة لتثبيت Node.js هي من خلال المثبت الرسمي:

  1. قم بزيارة nodejs.org
  2. قم بتنزيل إصدار LTS (الدعم طويل الأمد) للاستقرار
  3. قم بتشغيل المثبت واتبع معالج التثبيت
  4. يتضمن المثبت كلاً من 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 كامل بالمتطلبات التالية:

  1. تهيئة مشروع جديد باستخدام npm
  2. تثبيت express و dotenv كتبعيات
  3. تثبيت nodemon كتبعية تطوير
  4. إنشاء ملف .env مع متغيرات PORT و APP_NAME
  5. إنشاء خادم Express بنقاط النهاية التالية:
    • GET / - يعيد رسالة ترحيب مع اسم التطبيق من .env
    • GET /health - يعيد حالة صحة الخادم
    • POST /api/echo - يعيد نص الطلب
  6. إضافة سكريبتات npm للتطوير والإنتاج
  7. إنشاء ملف .gitignore مناسب
  8. اختبار جميع نقاط النهاية

استكشاف المشكلات الشائعة وإصلاحها

المشكلة 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 والمزيد!