Package Manager ابزاری است که توسعه‌دهندگان برای یافتن، دانلود، نصب، پیکربندی، ارتقاء و حذف پکیج‌های مورد نیاز خود به طور خودکار از آن استفاده می‌کنند. در این مقاله قصد داریم تا درمورد Package Managerهایی مانند NPM و Yarn صحبت کنیم و هر آن چه را که برای شروع کار با آن‌ها لازم است بدانیم را مورد بررسی قرار دهیم.

چرا در کار توسعه خود به یک Package Manager نیاز داریم؟ در ادامه به این سوال پاسخ خواهیم داد.

چرا به یک Package Manager نیاز داریم؟

اگر فرض کنیم که هیچ Package Managerای وجود نداشت، در این صورت تمام کارهای زیر را باید به صورت دستی انجام می‌دادیم:

مدیریت دستی ده‌ها یا صدها پکیج یک کار خسته‌کننده و بسیار وقت‌گیر است. بنابراین، Package Managerهایی مانند NPM، pNPM، Bower و Yarn به ما کمک می‌کنند تا فرآیند خسته‌کننده مدیریت دستی packageها به شکل خودکار انجام شود.

البته باید به این موضوع توجه کنیم که Package Manager با Package Registry یکسان نیست.

تفاوت بین Package Manager وPackage Registry در چیست؟

Package Manager ابزاری است که توسعه‌دهندگان برای یافتن، دانلود، نصب، پیکربندی، ارتقاء و حذف پکیج‌های کامپیوتری به‌طور خودکار از آن استفاده می‌کنند.

NPM (Node Pachage Manager) و Yarn (Yet Another Resource Negotiator) دو Package Manager پرکاربرد هستند.

Package Registry یک پایگاه داده برای ذخیره‌سازی هزاران پکیج(کتابخانه‌ها، پلاگین‌ها، چارچوب‌ها یا ابزارها) است. به عبارت دیگر، مکانی است که پکیج‌ها در آن منتشر و نصب می‌شوند.

NPM Registry و GitHub Packages دو Package Registry پرکاربرد هستند.

اکنون که می‌دانیم Package Manager چیست و چرا به آن نیاز داریم، می‌توانیم نحوه استفاده از دو مورد از پرکاربردترین‌ها یعنی NPM و Yarn را بررسی کنیم.

البته باید به این موضوع توجه داشته باشیم که بحث‌های متعددی در مورد ارجحیت NPM به Yarn وجود دارد، ولی ما در این مقاله از آن‌ها اجتناب می‌کنیم زیرا بهترین Package Manager همانی است که بهترین کار را برای ما انجام می‌دهد.

بنابراین، این مقاله نشان می‌دهد که NPM و Yarn چگونه کار می‌کنند، نه اینکه بگوید کدام یک از آن‌ها بهترین است. درنهایت این ما هستیم که تصمیم می‌گیریم کدام یک را انتخاب کنیم.

همچنین امکانی که وجود دارد این است که می‌توانیم برای یک پروژه از NPM و برای پروژه‌ی دیگر از Yarn استفاده کنیم.

چگونه Node Package Manager (NPM) را نصب کنیم؟

NPM هنگام نصب Node به طور خودکار نصب می‌شود. بنابراین، برای نصب NPM بر روی سیستم خود، به وب‌سایت NodeJS می‌رویم و آخرین LTS  نود یا نسخه فعلی را دانلود می‌کنیم.

چگونه Yarn را نصب کنیم؟

بهتر است Yarn را از طریق NPM نصب کنیم. بنابراین، ابتدا NPM را از وب سایت Node.js دانلود و نصب کنیم. سپس برای نصب Yarn به صورت زیر ادامه می‌دهیم:

npm install -g yarn

نحوه بررسی نسخه Node نصب شده

برای بررسی نسخه Node.js نصب شده روی سیستم خود، دستور زیر را اجرا می‌کنیم:

node -v

منظور از علامت v- در دستور بالا مخفف --versionاست.

نحوه بررسی نسخه NPM نصب شده

برای بررسی نسخه NPM نصب شده روی سیستم خود، دستور زیر را اجرا می‌کنیم:

npm -v

نحوه بررسی نسخه Yarn نصب شده

برای بررسی نسخه Yarn نصب شده روی کامپیوتر خود،دستور زیر را اجرا می‌کنیم:

yarn -v

نحوه ارتقا Node Package Manager به آخرین نسخه موجود

برای این که NPM را به آخرین نسخه موجود ارتقا دهیم دستور زیر را اجرا می‌کنیم:

npm install npm@latest -g

نحوه ارتقا NodeJS

برای ارتقا Node.js به آخرین نسخه دو راه وجود دارد:

راه حل اول: به‌روزرسانی از طریق وب سایت NodeJS

یکی از راه‌های ارتقای NodeJS، این است که به شکل دستی آخرین نسخه را از وب‌سایت Node.js دانلود و نصب کنیم.

راه حل دوم: بروزرسانی از طریق ابزار مدیریت نسخه

راه دیگر این است که از یک version manager مانند NVM، n یا nvs استفاده کنیم.

نحوه ارتقا Yarn به آخرین نسخه موجود

برای این که Yarn به آخرین نسخه آپدیت پیدا کند، دستور زیر را اجرا می‌کنیم:

yarn set version latest

اکنون که NPM(و یا Yarn) را روی کامپیوتر خود داریم، می‌توانیم از manager نصب شده برای پیدا کردن، نصب، پیکربندی و حذف پکیج‌های پروژه خود استفاده کنیم.

اما منظور از پکیج‌ دقیقا چیست؟

پکیج دقیقاً چیست؟

پکیج یک دایرکتوری(یا پروژه) است که دارای یک فایل package.jsonمی‌باشد که برای ثبت اطلاعات مربوط به آن مورد استفاده قرار می‌گیرد.

موضوعی که باید به آن توجه کنیم این است که ما فقط می‌توانیم پکیج‌ها(پروژه‌ای که با فایل package.jsonتوصیف شده است) را در NPM registry منتشر کنیم.

نحوه نصب پکیج‌ها

دو راه برای نصب پکیج وجود دارد: محلی یا سراسری.

نصب پکیج محلی

پکیج‌ای که به شکل محلی نصب شده است، فقط در پروژه‌ای که آن را نصب کرده‌ایم می‌توانیم مورد استفاده قرار دهیم.

برای نصب یک پکیج به صورت محلی، مراحل زیر را طی می‌کنیم:

توجه: باید Node و NPM را روی سیستم خود داشته باشیم تا بتوانیم از دستورات نصبNPM (و یا Yarn) استفاده کنیم.

دستور نصب NPM

npm install package-name --save

باید توجه داشته باشیم که دستور --saveدر دستور بالا به NPM می‌گوید تا package-nameرا در فایل package.jsonبه عنوان یکی از بسته‌هایی که پروژه به آن وابسته است، ذخیره کند.

اگر بخواهیم یک نسخه مشخص از یک پیکج را نصب کنیم در چنین حالتی، یک @[version-number]بعد از نام پکیج اضافه می‌کنیم:

npm install package-name@4.14.1 --save

از طرف دیگر، اگر پکیج‌ای که نصب می‌کنیم برای اهداف توسعه و تست است، از دستور زیر استفاده می‌کنیم:

npm install package-name --save-dev

دستورات بالا باعث می‌شود تا NPM سه مورد را در دایرکتوری root پروژه ما دانلود کند: یک پوشه node_modules، یک فایل package.jsonو یک فایل package-lock.json. در ادامه به شکل مفصل درباره این موارد صحبت خواهیم کرد.

دستور نصب Yarn

yarn add package-name

اگر بخواهیم یک نسخه مشخص از یک پکیج را نصب کنیم در چنین حالتی، یک @[version-number]بعد از نام پکیج اضافه می‌کنیم:

yarn add package-name@4.14.1

از طرف دیگر، اگر پکیج‌ای که نصب می‌کنیم برای اهداف توسعه و تست است، از دستور زیر استفاده می‌کنیم:

yarn add package-name --dev

دستورات بالا باعث می‌شود تا Yarn سه مورد را در دایرکتوری root پروژه ما دانلود کند: یک پوشه node_modules، یک فایل package.json و یک فایل yarn.lock. در ادامه به‌طور کامل درباره این موارد صحبت خواهیم کرد.

نصب پکیج سراسری

پکیج‌ای که به شکل سراسری نصب می‌شود این قابلیت را دارد تا در هر نقطه‌ای از سیستم خود بتوانیم از آن استفاده کنیم. برای نصب پکیج به صورت سراسری، دستور زیر را در ترمینال اجرا می‌کنیم:

npm install package-name -g

و یا اینکه می‌توانیم از Yarn به صورت زیر استفاده کنیم:

yarn global add package-name

مقایسه نصب پکیج به شکل محلی و سراسری

به‌طور کلی بهتر است که پکیج مورد نیاز خود را به صورت محلی نصب کنیم. در ادامه به برخی از تفاوت‌های بین نصب محلی و سراسری اشاره کرده‌ایم:

تفاوت اول: محل نصب

پکیج محلی در دایرکتوری که در دستور npm install package-name (و یا yarn add package-name) اجرا می‌کنیم، نصب می‌شود.

به طور خاص، پکیج‌های نصب شده محلی پروژه را در دایرکتوریnode_moduleآن خواهیم یافت. اما در مقابل، یک پکیج نصب شده به شکل سراسری در یک مکان واحد روی سیستم ما نصب می‌شود و مکان دقیق، به پیکربندی سیستم بستگی دارد.

تفاوت دوم: نسخه‌های پکیج

اگر پکیج خود را به صورت محلی نصب کرده باشیم، می‌توانیم از نسخه‌های مختلف یک پکیج برای توسعه چند اپلیکیشن استفاده کنیم. با این حال، اگر پکیج را به شکل سراسری نصب کنیم، مجبور می‌شویم از یک نسخه پکیج یکسان برای همه برنامه‌های خود استفاده کنیم.

تفاوت سوم: به‌روزرسانی‌ها

نصب محلی این امکان را به ما می‌دهد تا بتوانیم پکیج‌های پروژه را که می‌خواهیم به آخرین نسخه ارتقا دهیم را انتخاب کنید. این امر مدیریت به‌روزرسانی‌هایی را که سازگاری با پکیج‌های دیگر را مختل می‌کنند، آسان‌تر می‌کند.

با این حال، ارتقاء یک پکیج نصب شده در سطح سراسری، بسته را برای همه پروژه‌ها به‌روزرسانی می‌کند. که این اتفاق می‌تواند سازگاری با بسته‌های دیگر را به هم بزند و مشکلات بسیار زیادی را برای نگه‌داری آن‌ها ایجاد کند.

تفاوت چهارم: توصیه استفاده

نصب سراسری برای پکیج‌هایی که قصد داریم از آن‌ها فقط در خط فرمان خود استفاده کنیم بهترین انتخاب است، به خصوص زمانی که دستورات اجرایی قابل استفاده مجدد در پروژه‌ها را ارائه می‌دهند. اما نصب محلی برای پکیج‌هایی که قصد داریم از طریق دستور importیا تابع require()از آن‌ها استفاده کنیم، بهترین انتخاب می‌باشد.

تفاوت پنجم: مثال‌ها

NPM، React Native CLI، Gatsby CLI، Grunt CLI و Vue CLI نمونه‌های شناخته شده‌ای از پکیج‌های سراسری هستند. همینطور Webpack، Lodash، Jest و MomentJS نیز از نمونه‌های رایج پکیج‌های محلی به‌شمار می‌روند.

البته باید به نکات زیر توجه داشته باشیم:

اما پوشهnode_modules، فایل package.json، فایل package-lock.jsonو فایل yarn.lockدقیقا چیست؟

منظور از پوشه node_modules چیست؟

دایرکتوری node_modulesپوشه‌ای است که NPM تمام پکیج‌هایی را که به صورت محلی برای پروژه مدنظر ما دانلود می‌کند، در آن قرار می‌دهد.

منظور از فایل package.json چیست؟

فایل package.json یک سند JSON است که Package Managerها(مانند NPM و Yarn) برای ذخیره‌سازی اطلاعات مربوط به یک پروژه خاص از آن استفاده می‌کنند.

به عبارت دیگر، فایل package.json فایل متادیتا یک پروژه است.

مزایای فایل package.json

یک فایل package.json:

نحوه ایجاد فایل package.json

به دایرکتوری root پروژه خود می‌رویم و با اجرای دستور زیر یک فایل package.jsonایجاد می‌کنیم:

npm init

یا اگر از Yarn استفاده می‌کنیم، باید دستور زیر را اجرا کنیم:

yarn init

هنگامی که دستور مقداردهی اولیه که در بالا به آن اشاره کردیم را اجرا کنیم، Package Manager با پرسیدن چند سوال در مورد پروژه ما را در ایجاد فایل package.json راهنمایی می‌کند. اما اگر بخواهیم از این سوالات رد شویم، می‌توانیم یک فایل package.jsonبصورت پیش‌فرض ایجاد کنیم.

نحوه ایجاد یک فایل پیش‌فرض package.json

فرض کنید ترجیح می‌دهیم از سوالاتی که توسط دستور npm init(یا yarn init) پرسیده می‌شود، صرف‌نظر کنیم. در چنین شرایطی، به دایرکتوری root پروژه خود می‌رویم و دستور زیر را اجرا می‌کنیم:

npm init -y

و یا اگر Package Managerای که استفاده می‌کنیم Yarn است، دستور زیر را اجرا می‌کنیم:

yarn init -y

دستورات بالا از مقادیر پیش‌فرض استخراج شده از دایرکتوری فعلی برای ایجاد فایل package.jsonپروژه ما استفاده می‌کند.

توجه: علامت y- مخفف --yesاست.

هنگامی که Package Manager فرآیند مقداردهی اولیه خود را به پایان می‌رساند، فایل package.jsonپروژه ما حاوی یک آبجکت با مجموعه‌ای از ویژگی‌ها خواهد بود.

به عنوان مثال:

{
  "name": "codesweetly-project",
  "version": "1.0.0",
  "main": "index.js"
}

همانطور که می‌بینید فایل package.jsonحاوی نام، نسخه و فیلدهای اصلی می‌باشد. در ادامه با این ویژگی‌ها بیشتر آشنا خواهیم شد.

فیلدهای package.json

ویژگی‌های package.json باعث می‌شود تا پروژه ما برای Package Managerها و کاربران نهایی قابل استفاده باشد.

فرض کنید می‌خواهیم پکیج خود را در NPM registry منتشر کنیم. در این صورت، فایل package.json ما باید دارای فیلدهای “name”و “version” باشد.

با این حال اگر قصد نداشته باشیم که پکیج خود را منتشر کنیم، در این صورت همه فیلدها از جمله ویژگی‌های “name” و “version” اختیاری هستند.

در ادامه فیلدهای رایج در فایل package.json بیشتر بررسی می‌کنیم.

name

فیلد “name”  ویژگی است که برای ثبت یک نام برای پروژه، مورد استفاده قرار می‌گیرد.

در ویژگی “name” موارد زیر را باید رعایت کنیم:

باید توجه داشته باشیم که می‌توانیم کلمات را با خط تیره و underline به هم متصل کنیم.

مثلا:

{
  "name": "code_sweetly-project"
}

 version

فیلد “version” شماره نسخه فعلی پروژه را نشان می‌دهد.

ویژگی “version” باید به شکل قالب major.minor.patchباشد و همچنین از دستورالعمل‌های نسخه‌بندی معنایی پیروی کند.

به عنوان مثال:

{
  "version": "1.0.0"
}

description

فیلد “description” یک ویژگی است که شرح مختصری از اهداف پروژه ما را شامل می‌شود.

NPM توصیه می‌کند یک ویژگی “description” داشته باشیم تا پکیج ما راحت‌تر در وب سایت NPM پیدا شود. چون توضیحات ما یکی از مواردی است که هنگام اجرای فرمان جستجوی در npm نشان داده می‌شود.

به عنوان مثال:

{
  "description": "A brief description about this package (project)"
}

main

فیلد “main”در واقع entry point یک پروژه را نشان می‌دهد. به عبارت دیگر، زمانی که شخصی تابع require()را اجرا می‌کند، Node فراخوانی را به require(<package.json:main>) برطرف می‌کند.

مثلا:

{
  "main": "./src/index.js"
}

private

فیلد “private” به Package Managerها اجازه می‌دهد تا بدانند که آیا باید پروژه ما را در  NPM registry منتشر کنند یا خیر.

به عنوان مثال:

{
  "private": true
}

اگر ویژگی “private” را در فایل package.jsonخود روی true تنظیم کنیم، Package Managerها پروژه ما را منتشر نخواهند کرد.

بنابراین، تنظیم این ویژگی یک راه عالی برای جلوگیری از انتشار تصادفی پکیج مورد نظر ما می‌باشد.

scripts

فیلد “scripts” شامل دستورات اسکریپتی است که می‌خواهیم در زمان‌های مختلف در طول lifecycle پروژه‌ خود اجرا کنیم.

به عنوان مثال:

{
  "scripts": {
    "test": "jest",
    "dev": "webpack --mode development",
    "build": "webpack --mode production",
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build" 
  }
}

فیلد “scripts” بالا حاوی پنج ویژگی است که مقادیر آن‌ها دستوراتی است که می‌خواهیم Package Manager ما هر زمان که key ویژگی را فراخوانی می‌کنیم، اجرا کند. برای مثال، اگر npm run devرا اجرا کنیم دستور “webpack --mode development” اجرا می‌شود.

keywords

فیلد “keywords” مجموعه‌ای از کلمات کلیدی را مشخص می‌کند که می‌تواند به افراد در پیدا کردن پکیج ما کمک کند.

به عنوان مثال:

{
  "keywords": [
    "drag",
    "drop",
    "drag and drop",
    "dragndrop",
    "draggable" 
  ]
}

ویژگی “keywords” بخشی از اطلاعاتی است که هنگام اجرای فرمان جستجوی npm نشان داده می‌شود.

author

فیلد “author” شامل فهرستی از اطلاعات و جزئیات مربوط به نویسنده پروژه است.

به عنوان مثال:

{
  "author": "Oluwatobi Sofela <oluwatobiss@codesweetly.com> (https://www.codesweetly.com)"
}

همچنین دستور بالا را می‌توانیم به شکل زیر نیز بنویسیم:

{
  "author": {
    "name": "Oluwatobi Sofela",
    "email": "oluwatobiss@codesweetly.com",
    "url": "https://www.codesweetly.com"
  }
}

توجه به این نکته لازم است که ویژگی‌های “email” و “url” ختیاری هستند.

dependencies

فیلد “dependencies” شامل لیستی است که تمام پکیج‌هایی که یک پروژه برای تولید به آن‌ها وابسته است را دربرمی‌گیرد.

مثلا:

{
  "dependencies": {
    "first-package": "^1.0.4",
    "second-package": "~2.1.3"
  }
}

بنابراین، زمانی که یک کاربر پروژه ما را از NPM registry نصب می‌کند، ویژگی dependencies تضمین می‌کند که Package Managerها می‌توانند به‌طور خودکار پکیج‌های فهرست شده را پیدا و نصب کنند.

ما می‌توانیم از طریق یکی از راه‌هایی که در زیر به آن‌ها اشاره شده است، پکیجی را به فیلد “dependencies” اضافه کنیم:

devDependencies

فیلد “devDependencies” شامل فهرستی از تمام پکیج‌هایی می‌باشد که پروژه در تولید به آن‌ها نیاز ندارد، اما برای اهداف توسعه محلی و تست مورد نیاز می‌باشد.

به عنوان مثال:

{
  "devDependencies": {
    "first-dev-package": "^5.8.1",
    "second-dev-package": "3.2.2—۴٫۰٫۰"
  }
}

باید به این نکته توجه کنیم که پکیج‌های لیست شده در فیلد “devDependencies” در محیط توسعه پروژه در دسترس هستند اما در سرور محصول موجود نخواهند بود.

فرض کنید کاربری پروژه ما را از طریق دستور npm install(یا yarn add) نصب می‌کند. در چنین حالتی، Package Manager تمام devDependenciesهای لیست شده را در دایرکتوری node_modulesپروژه پیدا کرده و دانلود می‌کند.

از طریق یکی از راه‌هایی که در زیر به آن‌ها اشاره شده است، می‌توانیم پکیجی را به فیلد “devDependencies” اضافه کنیم:

homepage

فیلد “homepage” نشانی اینترنتی صفحه اصلی پروژه ما را مشخص می‌کند.

به عنوان مثال:

{
  "homepage": "https://codesweetly.com/package-json-file-explained"
}

تا اینجا مفاهیم مربوط به فایل package.jsonرا مورد بررسی قرار دادیم، در ادامه می‌خواهیم درمورد package-lock.jsonصحبت کنیم.

منظور از فایلpackage-lock.json چیست؟

فایل package-lock.jsonسندی است که NPM برای ثبت نسخه دقیق همه پکیج‌هایی که به صورت محلی در دایرکتوری node_modulesپروژه خود نصب کرده‌ایم، استفاده می‌کند.

یک فایل package-lock.jsonبرنامه را  دقیقاً همانطور که آن را در NPM registry منتشر کردیم،۱۰۰% قابل بازتولید می‌کند.

بنابراین، فرض کنید کاربری برنامه ما را شبیه‌سازی و کلون کرده و دستور npm installرا اجرا می‌کند. در چنین حالتی، package-lock.json تضمین می‌کند که کاربر نسخه دقیق تمام پکیج‌هایی را که برای توسعه برنامه خود استفاده کرده‌ایم، دانلود خواهد کرد.

یا به عنوان مثال، فرض کنید کاربری برنامه ما را که حاوی فایل package-lock.json نیست، کلون کرده است و یکی از پکیج‌های مورد استفاده در برنامه دارای نسخه جدیدتری است.

فرض کنید شماره نسخه پکیج در فایل package.jsonدارای علامت caret باشد (مثلاً ^۲٫۶٫۲). در این صورت، NPM آخرین نسخه پکیج مدنظر را نصب می‌کند، که این موضوع ممکن است باعث شود تا برنامه نتایج اشتباه تولید کند.

اما اکنون فرض کنید کاربر برنامه ما را که حاوی فایل package-lock.json است کلون کرده است. در این صورت، NPM نسخه دقیق پکیج موردنظر را همانطور که در فایل package-lock.json ثبت شده است، صرف نظر از اینکه نسخه جدیدتری وجود دارد یا خیر،نصب خواهد کرد.

بنابراین، کاربران همیشه برنامه ما را به همان روشی که آن را در NPM registry منتشر کرده‌ایم دریافت می‌کنند. به عبارت دیگر، NPM از فایل package-lock.json برای قفل کردن وابستگی‌های پکیج ما به شماره نسخه‌های خاصی که برای توسعه پروژه استفاده کرده‌ایم، استفاده می‌کند.

توجه: زمانی که ما دستور npm updateرا اجرا کنیم، NPM همه پکیج‌های ثبت شده در فایل package-lock.json را به‌روزرسانی می‌کند.

منظور از فایل yarn.lockچیست؟

فایل yarn.lockسندی است که Yarn از آن برای ثبت نسخه دقیق همه پکیج‌هایی که به صورت محلی در دایرکتوری node_modulesپروژه خود نصب کرده‌ایم، استفاده می‌کند. که البته فایل yarn.lockبا فایل lock-lock.jsonمربوط به NPM قابل مقایسه است.

همانطور که قبلاً اشاره کردیم Package Manager ما یک پکیج نصب شده را اجرا نمی‌کند، بلکه ما خودمان باید این کار را انجام دهیم. در ادامه بحث خواهیم کرد که چگونه باید این کار را انجام دهیم.

نحوه ران کردن یک پکیج قابل اجرا

راه‌های مختلفی برای ران کردن یک پکیج قابل اجرا وجود دارد. در ادامه تکنیک‌های استاندارد معرفی شده است.

پکیج مدنظر را به صورت دستی پیدا کرده و اجرا کنیم

یکی از راه‌های اجرا کردن این نوع پکیج‌ها این است که مسیر محلی آن را در خط فرمان خود تایپ کنیم:

./node_modules/.bin/package-name

پکیج را به فیلد scripts در فایل package.json اضافه کنیم

یکی از راه‌های جایگزین برای اجرای پکیج این است که ابتدا آن را به فیلد “scripts” در فایل package.jsonپروژه خود اضافه کنیم، مانند:

{
  "name": "your_package",
  "version": "1.0.0",
  "scripts": {
    "desired-name": "name-of-package-to-execute"
  }
}

پس از آن، پکیج را می‌توانیم به صورت زیر اجرا کنیم:

npm run desired-name

توجه داشته باشید که دستور بالا مخفف npm run-script-and-nameاست.

همچنین اگر از Yarn استفاده می‌کنیم، می‌توانیم پکیج را به صورت زیر اجرا کنیم:

yarn run desired-name

به عنوان مثال:

{
  "name": "codesweetly-app",
  "version": "1.0.0",
  "scripts": {
    "build": "webpack",
  }
}

دستور بالا webpack را به فیلد “scripts” در فایل package.jsonما اضافه می‌کند. بنابراین، اکنون می‌توانیم webpack را در خط فرمان به صورت زیر اجرا کنیم:

npm run build

و یا اگر از Yarn استفاده می‌کنیم:

yarn run build

استفاده از NPX

یک راه سریع‌تر برای اجرای یک پکیج اجرایی استفاده از NPX مانند دستور زیر است:

npx package-name

با NPX، دیگر نیازی نیست پکیج خود را به فیلد “scripts” فایل package.jsonپروژه خود اضافه کنیم.

(Node Package Execute) NPX یک اجراکننده پکیج Node است که به طور خودکار پکیج مشخصی را پیدا کرده و اجرا می‌کند.

به عنوان مثال:

npx webpack

دستور بالا به طور خودکار webpack را پیدا کرده و سپس اجرا می‌کند. بنابراین، ما نیازی به اضافه کردن ویژگی “build”:” webpack” به فیلد “scripts” فایل package.json خود نداریم.

توجه: هنگام نصب Node 8.2/NPM 5.2.0 یا نسخه‌های بالاتر، NPX به طور خودکار روی سیستم ما نصب می‌شود.

همچنین می‌توانیم با استفاده از نسخه دلخواه Node.js بسیاری از کدها را اجرا کنیم. در ادامه به بررسی این موضوع می‌پردازیم.

نحوه اجرای کد با استفاده از نسخه دلخواه Node.js

برای این کار می‌توانیم از کاراکتر @ و پکیج نود npm برای تعیین نسخه Node.js که می‌خواهیم برای اجرای کد خود تعیین کنیم، استفاده کنیم.

مثلا:

npx node@7 index.js

دستور بالا به NPX می‌گوید که index.js را با آخرین نسخه Node از نسخه ۷ اصلی اجرا کند.

بطور کلی استفاده از دستور node@راهی مفید برای جلوگیری از استفاده از ابزارهای مدیریت نسخه Node.js مانند nvm برای جابجایی بین نسخه‌های Node به حساب می‌آید.

فرض کنید می‌خواهیم نسخه Node که NPX برای اجرای کد ما از آن استفاده می‌کند را تأیید کنیم. در این صورت دستور زیر را اجرا می‌کنیم:

npx node@7 -v

دستور بالا آخرین نسخه Node از نسخه ۷ اصلی که NPX برای اجرای کد ما استفاده می‌کند، به عنوان مثال نسخه ۷٫۱۰٫۱ را نشان خواهد داد.

نحوه بررسی پکیج‌های محلی منسوخ شده

برای تعیین اینکه آیا هر یک از پکیج‌های پروژه ما قدیمی و منسوخ شده هستند یا خیر، دستور زیر را اجرا می‌کنیم:

npm outdated

اگر پس از اجرای دستور هیچ خروجی وجود نداشته باشد، به این معنی است که تمام پکیج‌های پروژه ما به‌روز هستند. در غیر این صورت، توضیح دقیق درمورد خروجی خط فرمان در این مقاله آورده شده است.

همچنین اگر از Yarn استفاده می‌کنیم:

yarn outdated

توجه: برای بررسی وضعیت یک پکیج خاص، می‌توانیم نام پکیج را پس از کلمه کلیدی outdated اضافه کنیم. به عنوان مثال، npm outdated lodash.

نحوه بررسی پکیج‌های سراسری منسوخ شده

برای تشخیص اینکه کدام پکیج سراسری منسوخ شده است، دستور زیر را اجرا می‌کنیم:

npm outdated -g --depth=0

نحوه بررسی پکیج‌های نصب شده به صورت محلی

سه راه برای بررسی پکیج‌های نصب شده به شکل محلی وجود دارد:

پکیج‌های نصب شده به صورت محلی همراه با وابستگی‌های آن‌ها

npm list

اگر از Yarn استفاده می‌کنیم:

yarn list

پکیج‌های نصب شده به صورت محلی – بدون وابستگی‌های آن‌ها

npm list --depth=0

هنگام استفاده از Yarn:

yarn list --depth=0

بررسی این که آیا پکیج خاصی به صورت محلی نصب شده است یا خیر

npm list package-name

نحوه بررسی پکیج‌های نصب شده به شکل سراسری

سه راه برای بررسی ‌پکیج‌های نصب شده به شکل سراسری وجود دارد:

پکیج‌های نصب شده به شکل سراسری همراه با وابستگی‌های آن‌ها

npm list -g

اگر از Yarn استفاده می‌کنیم:

yarn list -g

پکیج‌های نصب شده به شکل سراسری – بدون وابستگی‌های آن‌ها

npm list -g --depth=0

هنگام استفاده از Yarn:

yarn list -g --depth=0

بررسی این که آیا پکیج خاصی به شکل سراسری نصب شده است یا خیر

npm list -g package-name

نحوه به‌روزرسانی پکیج‌ها

در اینجا نحوه به‌روزرسانی پکیج‌ها با استفاده از NPM و Yarn را بررسی کرده‌ایم:

نحوه به‌روزرسانی یک پکیج خاص به آخرین نسخه آن

npm update package-name

اگر از Yarn استفاده کنیم:

yarn upgrade package-name

نحوه به‌روزرسانی تمام پکیج‌های نصب شده به شکل محلی در پروژه

npm update

هنگام استفاده از Yarn:

yarn upgrade

نحوه به‌روزرسانی یک پکیج خاص که به شکل سراسری نصب شده است

ما می‌توانیم یک پکیج خاص از پروژه را که به شکل سراسری نصب شده است، به صورت زیر به‌روزرسانی کنیم:

npm update package-name -g

نحوه به‌روزرسانی تمام پکیج‌های نصب شده سراسری موجود در سیستم خود

npm update -g

نحوه حذف پکیج‌ها

در این قسمت نحوه حذف پکیج‌ها با استفاده از NPM و Yarn را بررسی کرده‌ایم:

نحوه حذف یک پکیج از یک پروژه خاص

ابتدا از طریق خط فرمان به دایرکتوری root پروژه خود می‌رویم و دستور زیر را اجرا می‌کنیم:

npm uninstall package-name

نکات مهمی که باید به آن‌ها توجه کنیم:

برای پروژه‌هایی که با Yarn مدیریت می‌شوند:

yarn remove package-name

توجه: دستور yarn remove فایل‌هایpackage.jsonو yarn.lockپروژه را به طور خودکار به‌روزرسانی می‌کند.

نحوه حذف یک پکیج سراسری

npm uninstall package-name -g

باید به این موضوع توجه داشته باشیم که بهترین کار این است که پکیج‌ها را به صورت دستی از پوشه node_modulesحذف نکنیم. زیرا این عمل می‌تواند بر روی ماژول‌های(modules) پکیج‌های دیگر نیز تأثیر بگذارد.

اما منظور از ماژول(module) در NodeJS دقیقا چیست؟

منظور از ماژول در NodeJS دقیقا چیست؟

یک ماژول در NodeJS هر فایلی در پوشه node_modules است که کامپیوتر می‌تواند از طریق تابعrequire()نود آن را لود کند.

به عنوان مثال:

const myModule = require("./codesweetly.js");

فرض می‌کنیم کامپیوتر با موفقیت از تابع require() برای لود کردن فایل codesweetly.jsاستفاده کرده است. در چنین حالتی codesweetly.js یک ماژول است که به متغیر myModule اختصاص داده شده است.

باید به خاطر داشته باشیم که یک ماژول ممکن است یک پکیج باشد، اما این موضوع همیشه صادق نیست.

اگر ماژول فایل package.jsonبرای ثبت اطلاعات مورد نیازی که در آن استفاده می شود، نداشته باشد یک پکیج نیست. همچنین باید به این نکته توجه داشته باشیم برای اینکه یک ماژول توسط تابعrequire() قابل لود باشد، ماژول باید یکی از موارد زیر باشد:

نحوه منتشر کردن پروژه خود در NPM Registry

NPM یک رجیستری رایگان برای نویسندگان پکیج‌های عمومی است. بنابراین می‌توانیم از آن برای انتشار هر پروژه‌ای از کامپیوتر خود که دارای فایل package.json است، استفاده کنیم.

در ادامه مراحلی که برای به اشتراک گذاشتن پروژه خود نیاز داریم، معرفی شده است:

گام اول: ورود به حساب کاربری یا ایجاد آن

به وب‌سایت NPM مراجعه می‌کنیم و وارد حساب کاربری خود می‌شویم (اگر هنوز حساب کاربری نداریم، ثبت نام می‌کنیم).

توجه: حتما باید مطمئن شویم که ایمیل خود را پس از ایجاد یک حساب کاربری جدید تایید کرده باشیم. در غیر این صورت هنگام انتشار پکیج خود با خطای ۴۰۳ Forbidden مواجه خواهیم شد.

گام دوم: ورود به حساب کاربری

از طریق خط فرمان و دستور زیر به حساب کاربری NPM خود وارد می‌شویم، مانند:

npm login

توجه: می توانیم برای بررسی اینکه آیا در حال حاضر وارد حساب خود شده‌ایم یا خیر، از دستور npm whoamiاستفاده کنیم.

گام سوم: پکیج مدنظر خود را منتشر می‌کنیم

به دایرکتوری root پروژه خود می‌رویم و آن را به صورت زیر منتشر می‌کنیم:

npm publish

باید از این موضوع مطمئن شویم که در NPM پکیج با نام‌گذاری مشابه وجود نداشته باشد. در غیر این صورت هنگام انتشار با خطا مواجه خواهیم شد.

اگر میخواهیم بررسی کنیم که آیا نام مدنظر ما قبلاً در NPM وجود داشته یا خیر، می‌توانیم از فرمان جستجوی npm (یا نوار جستجوی در وب‌سایت NPM) برای این کار استفاده کنیم.

فرض کنید همه نام‌های مناسب برای پکیج ما قبلاً گرفته شده است. در این صورت، NPM به ما این امکان را می‌دهد پروژه خود را تحت عنوان یک محدوده(scope) منتشر کنیم. به عبارت دیگر، می‌توانید پکیج خود را به عنوان زیرمجموعه نام کاربری خود منتشر کنیم.

نحوه انتشار پکیج خود تحت عنوان محدوده نام کاربری خود

فایل package.jsonخود را باز می‌کنیم و نام کاربری خود را به عنوان پیشوند نام پکیج خود قرار می‌دهیم.

مثلا:

{
  "name": "@username/package-name",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

تنظیمات پیش‌فرض NPM به این صورت است که یک پکیج با نام محدوده را پروژه خصوصی درنظر می‌گیرد. بنابراین، اگر از دستور npm publishبرای به اشتراک گذاشتن پکیج با نام محدوده استفاده کنیم، با خطا مواجه خواهیم شد.

بنابراین، برای انتشار پکیج خود به عنوان محدوده نام کاربری،  علامت --access=publicرا به دستور npm publish اضافه کنید:

npm publish --access=public

توجه: می‌توانیم با استفاده از دستورnpm init --scope=usernameبه جای npm init، پروژه خود را در همان مرحله مقداردهی اولیه به یک پکیج scoped تبدیل کنیم.

جمع‌بندی

این مقاله به این موضوع که Package Manager چیست پرداختیم. همچنین نحوه کار دو package manager محبوب یعنی NPM و Yarn را بررسی کردیم.

 

منبع