شرح npm.. مدير حزم Node.js

لا يوجد مطور جافا سكريبت أو Node.js لم يسبق له التعامل مع مدير الحزم npm أو Node package manager.

في هذه المدونة استعملناه مرارا وتكرارا في دروس ومقالات متعددة لتثبيت حزم Node.js والقيام بمختلف العمليات التي تخصه انطلاقا من نافذة الأوامر السطرية.

في متم 2019 بلغ عدد الحزم الموجودة في مستودع NPM أكثر من 1 مليون حزمة تلبي تقريبا كافة الإحتياجات التي قد تفكر فيها، ليكون بذلك أكبر وأضخم مستودع للحزم من بين جميع مستودعات لغات البرمجة الأخرى.

تطور عدد الحزم في مستودع npm

تحميل وتثبيت npm

بمجرد تثبيت بيئة التشغيل Node.js في جهازك فإنه سيتم تلقائيا تثبيت مدير الحزم npm أيضا.

للتأكد من أن npm مثبت فعلا في الجهاز، قم بتنفيذ الأمر التالي في نافذة الأوامر السطرية (Terminal):

npm -v

سيتم إظهار نسخة npm في جهازك أو رسالة خطأ في حال لم تتم عملية التسطيب كما يجب.

6.9.0

استعمالات مدير الحزم npm

1. تهيئة مشروع Node.js جديد

يمكن الدخول لأي مجلد جديد وتنفيذ npm init ليتم إنشاء ملف package.json جديد.

هذا الملف يضم كافة التبعيات الخاصة بالمشروع، ولذلك نجده في كافة مشاريع Node.js و JavaScript الحديثة.

2. تحميل التبعيات

لتحميل تبعيات المشروع يكفي تنفيذ الأمر التالي:

npm install

بمجرد تنفيذ هذا الأمر سيتم البحث عن الملف package.json وتحميل كافة التبعيات التي يضمها.

تبعيات المشروع نجدها في مجلد اسمه node_modules ولعلك شاهدت هذا المجلد من قبل في مواضع عدة.

3. تحميل حزمة محددة

يمكن تحميل حزمة محددة (مثلا مكتبة React) بهذه الطريقة:

# npm install <package-name>
npm install react

ويمكن إضافة البارامتر --save-dev إلى هذا الأمر لكي نخبر npm بأن التبعية خاصة ببيئة التطوير فقط (Developement) ولا يجب تضمينها في ملف (أو ملفات) جافا سكريبت التي يتم بناؤها لبيئة الإنتاج (Production).

هذا مثال لتحميل مكتبة jest التي نستعملها في الإختبارات الوحداتية (Unit Testing) لمشاريع جافا سكريبت:

npm install jest --save-dev

التبعيات الخاصة بمرحلة التطوير يتم إضافتها لمنطقة خاصة في ملف package.json اسمها devDependencies.

package.json
{
  "name": "react-project",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-scripts": "3.3.1"
  },
  "devDependencies": {    "jest": "24.9.0"  },  "browserslist": {
    "production": [">0.2%", "not dead", "not op_mini all"],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

4. تحديث التبعيات

تحديث التبعيات كذلك في غاية السهولة مع npm:

npm update

هذا الأمر سيمر على جميع تبعيات المشروع في الملف package.json ويقول بتحديثها في حال وجود أي تحديث لكل واحدة منها.

ويمكن تحديث تبعية بعينها بإضافة اسمها كما يلي:

npm update <package-name>

5. التحكم في الإصدارات

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

هذا متاح بسهولة مع Node Package Manager، فقط نقوم بإضافة الرمز @ إلى اسم الحزمة وبعدها الإصدار الذي نريد تحميله:

npm install package@version

هكذا نكون متأكدين بأن جميع المتدخلين أو العاملين في المشروع يستعملون نفس الإصدارات للحزم، والفضل في هذا يعود للملف package.json الذي يُسَجَّل فيه إصدار أي مكتبة أو حزمة نقوم بتحميلها.

6. تشغيل المهام

تشغيل المهام أو Running Tasks من الأمور المهمة كذلك التي يضطلع بها مدير الحزم NPM.

في ملف package.json يمكننا تعيين المهام التي نريد تنفيذها في Terminal وذلك بكتابة npm run متبوعا باسم المهمة التي نريد تشغيلها:

npm run <task>

يتم تعيين تلك المهام في المنطقة scripts من الملف package.json.

package.json
{
  "scripts": {
    "watch": "webpack --watch --progress --colors --config webpack.conf.js",
    "dev": "webpack --progress --colors --config webpack.conf.js",
    "prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
  }
}

في المثال أعلاه بعض المهام التي نستخدمها في العادة عند التعامل مع المحزم Webpack.

عوض كتابة ما يلي في نافذة الأوامر السطرية:

webpack --watch --progress --colors --config webpack.conf.js

نكتب بدلا عنه فقط:

npm run watch

الأمران مترادفان ولكن الثاني أسهل بكثير سواء من ناحية كتابته أو حتى حفظه وتذكره.

في الختام

استعمال مدير الحزم npm شائع جدا في يومنا هذا في مجال تطوير تطبيقات الويب، وفي كل مرة نريد تحميل حزمة Node.js فلابد من استعماله.

هو بالنسبة لمطوري الويب و Node.js بمثابة pip أو composer لمطوري Python و PHP.

مثله مثل مدير النسخ git، أصبح التعامل مع npm ونافذة الأوامر السطرية (Command Line) من الأمور الأساسية التي يتعامل معها المطورون بشكل يومي في أيامنا الحالية، ولذلك لا بد من استيعاب الموضوع بشكل جيد حتى نحقق منه الإستفادة القصوى.