اگر حتی یکبار سراغ Node.js رفته باشید، حتماً اسم NPM به گوشتان خورده. راستش را بخواهید، NPM یکی از همان چیزهایی است که آنقدر در کارها استفاده میشود که خیلیها اصلاً یادشان میرود یک روزی بدون آن هم برنامهنویسی میکردند! در این مقاله میخواهیم قدمبهقدم ببینیم NPM دقیقاً چیست، از کجا آمده، و چطور میشود از آن به بهترین شکل استفاده کرد.
اول از همه، NPM یعنی چه؟
NPM مخفف Node Package Manager است؛ یعنی «مدیر بستهی نود». البته یک نکتهی جالب هست: تیم سازندهی NPM هیچوقت رسمی این را بهعنوان سرواژه تأیید نکرده و گاهی میگویند فقط یک اسم است، نه مخفف چیزی خاص. اما در عمل، همه همان معنای «مدیر بستهی نود» را در ذهن دارند و همین برداشت هم جا افتاده.
اگر بخواهیم NPM را باز کنیم، سه تکهی اصلی دارد:
- رجیستری: یک انبار عظیم آنلاین که میلیونها بستهی جاوااسکریپتی توی آن جمع شده.
- خط فرمان (CLI): همان ابزاری که روی سیستم نصب میکنید و با آن بستهها را نصب، حذف یا آپدیت میکنید.
- وبسایت: جایی که میشود بستهها را جستوجو کرد، مستندات را خواند و حساب کاربری را مدیریت کرد.
داستان شکلگیری NPM
NPM را آیزاک شلوگر در سال ۲۰۱۰ ساخت. ایدهاش هم خیلی ساده بود: قبل از NPM، اگر میخواستید یک کتابخانه در پروژهتان استفاده کنید، باید دستی دنبالش میگشتید، دانلودش میکردید و امیدوار بودید با بقیهی کدتان جور دربیاید. کار وقتگیر و پر از دردسری بود.
از آن زمان تا الان NPM آنقدر رشد کرده که امروز بزرگترین رجیستری نرمافزاری دنیا حساب میشود؛ جایی که روزانه میلیاردها بار از آن دانلود انجام میشود. یک نکته هم اینکه در سال ۲۰۲۰، گیتهاب (که خودش زیرمجموعهی مایکروسافت است) NPM را خرید.
اصلاً چرا به یک مدیر بسته نیاز داریم؟
فرض کنید دارید یک پروژهی وب میسازید و به یک کتابخانه برای کار با تاریخ، یکی برای درخواستهای HTTP و یک فریمورک برای رابط کاربری نیاز دارید. بدون مدیر بسته باید:
- کد هر کتابخانه را خودتان پیدا و دانلود کنید.
- بفهمید کدام نسخه با پروژهتان سازگار است.
- وابستگیهای خودِ آن کتابخانهها را هم دستی مدیریت کنید (که آنها هم معمولاً به چیزهای دیگری نیاز دارند).
- هر بار که میخواهید آپدیت کنید، دوباره همهی این مراحل را تکرار کنید.
NPM دقیقاً همین دردسرها را از سر راه برمیدارد. کافی است یک دستور کوتاه در ترمینال بزنید تا بستهی موردنظر همراه با همهی وابستگیهایش خودش را نصب کند.
نصب NPM
خبر خوب این است که لازم نیست NPM را جدا نصب کنید؛ همراه Node.js میآید. یعنی فقط کافی است Node.js را از سایت رسمیاش بگیرید و نصب کنید، NPM هم خودش همراهش میآید.
برای اینکه مطمئن شوید همهچیز درست نصب شده، این دو دستور را در ترمینال بزنید:
node -v
npm -v
اگر شمارهنسخهها را برایتان نشان داد، یعنی آمادهاید.
فایل package.json چه کاره است؟
اگر بخواهیم یک فایل را قلب هر پروژهی Node.js بدانیم، همین package.json
است. این فایل اطلاعات مهمی دربارهی پروژه نگه میدارد، از جمله:
- نام و نسخهی پروژه
- توضیح کوتاهی دربارهاش
- نام نویسنده و نوع لایسنس
- لیست کامل وابستگیها و وابستگیهای مخصوص توسعه
- اسکریپتهایی که میشود اجرا کرد
برای ساختنش، همینقدر کافی است که در پوشهی پروژه بنویسید:
npm init
چند سؤال ساده میپرسد (اسم پروژه، نسخه، توضیحات و…) و فایل را برایتان میسازد. اگر حوصلهی جواب دادن ندارید و میخواهید یک نسخه با مقادیر پیشفرض ساخته شود، این را بزنید:
npm init -y
دستورهایی که هر روز به کارتان میآید
نصب یک بسته
npm install lodash
یا کوتاهترش:
npm i lodash
نصب فقط برای مرحلهی توسعه
بعضی بستهها فقط موقع توسعه لازماند، مثل ابزارهای تست، و قرار نیست در محصول نهایی
باشند. برای اینجور بستهها از --save-dev استفاده میکنیم:
npm install jest --save-dev
نصب همهی وابستگیهای یک پروژه
وقتی یک پروژه را از گیتهاب یا هرجای دیگری میگیرید، معمولاً پوشهی
node_modules همراهش نیست. کافی است در پوشهی پروژه این را بزنید تا
همهچیزی که در package.json تعریف شده نصب شود:
npm install
حذف یک بسته
npm uninstall lodash
آپدیت بستهها
npm update
نصب سراسری یک بسته
بعضی ابزارها باید در کل سیستم در دسترس باشند، نه فقط داخل یک پروژهی خاص. اینجا از
فلگ -g استفاده میشود:
npm install -g nodemon
اجرای اسکریپتها
داخل package.json میشود بخشی به اسم scripts تعریف کرد:
"scripts": {
"start": "node index.js",
"test": "jest"
}
و بعد با این دستورها اجرایشان کرد:
npm run start
npm run test
فایل package-lock.json چه فرقی با package.json دارد؟
وقتی بستهای نصب میکنید، NPM یک فایل دیگر هم به اسم package-lock.json
میسازد. کار این فایل ثبت دقیق نسخهی همهی بستهها و زیربستههاست. فایدهاش این است
که مطمئن میشوید همهی افراد تیم، حتی روی سیستمهای مختلف، دقیقاً همان نسخههایی را
نصب میکنند که شما نصب کردهاید؛ حتی اگر بعداً نسخههای جدیدتری منتشر شده باشد.
نسخهبندی معنایی (SemVer) یعنی چه؟
بستههای NPM معمولاً از الگویی به اسم Semantic Versioning پیروی میکنند،
به شکل MAJOR.MINOR.PATCH؛ مثلاً 4.17.21. هر بخش یک معنی دارد:
- MAJOR: تغییرات بزرگی که ممکن است با نسخههای قبلی سازگار نباشد.
- MINOR: قابلیتهای تازه، بدون اینکه چیزی را بشکند.
- PATCH: رفع باگهای کوچک، بدون تغییر در قابلیتها.
داخل package.json هم معمولاً علامتهایی مثل ^ یا
~ قبل از شمارهنسخه میبینید که مشخص میکند تا کجا اجازهی آپدیت خودکار
وجود دارد.
پس npx چیست؟
با نسخههای جدیدتر NPM، ابزار دیگری هم به اسم npx اضافه شد. برخلاف NPM که برای نصب و مدیریت بستههاست، npx به شما اجازه میدهد یک بسته را مستقیم اجرا کنید، بدون اینکه لازم باشد آن را دائمی نصب کنید. مثلاً:
npx create-react-app my-app
این دستور بستهی create-react-app را موقتاً دانلود و اجرا میکند، بدون
اینکه نیاز باشد آن را سراسری روی سیستم نصب کنید.
جایگزینهای NPM
با همهی محبوبیتی که NPM دارد، چند ابزار دیگر هم برای مدیریت بسته وجود دارند که هرکدام یک مزیت خاص دارند:
- Yarn: ساختهی فیسبوک (متا)، با تمرکز روی سرعت بیشتر و امنیت بالاتر در نصب بستهها.
- pnpm: با یک روش متفاوت در ذخیرهسازی بستهها که هم فضای دیسک را ذخیره میکند و هم سرعت نصب را بالا میبرد.
با این حال، NPM همچنان ابزار پیشفرض و رسمی Node.js است و بیشترین استفاده را در میان برنامهنویسها دارد.
چند نکته دربارهی امنیت
چون هرکسی میتواند بستهای را در رجیستری NPM منتشر کند، مسئلهی امنیت
خیلی جدی است. NPM ابزاری دارد به اسم npm audit که آسیبپذیریهای
شناختهشده در وابستگیهای پروژهتان را پیدا و گزارش میکند:
npm audit
و این دستور هم سعی میکند در صورت امکان، آنها را خودش برطرف کند:
npm audit fix
یک توصیهی ساده: قبل از نصب بستههای ناشناس، یک نگاهی به تعداد دانلودها، تاریخ آخرین آپدیت و اعتبار توسعهدهندهاش بیندازید.
حرف آخر
NPM یکی از آن ابزارهایی است که واقعاً زندگی برنامهنویسهای جاوااسکریپت را راحتتر
کرده. دسترسی به میلیونها بستهی آماده، مدیریت خودکار وابستگیها و امکان اجرای
اسکریپتها، همه و همه باعث شده این ابزار به یکی از پایههای اصلی اکوسیستم
جاوااسکریپت تبدیل شود. آشنایی با NPM، از نصب و مدیریت بستهها گرفته تا درک
package.json، package-lock.json و نسخهبندی معنایی، برای
هر کسی که میخواهد جدی با جاوااسکریپت کار کند، ضروری است.
راستی، در همین مقاله چند بار به npx اشاره کردیم و گفتیم چطور فرق میکند با NPM. اگر کنجکاوید بیشتر دربارهاش بدانید، جای نگرانی نیست؛ مقالهی بعدی را کامل به npx اختصاص میدهیم و با جزئیات بیشتر و مثالهای کاربردیتر سراغش میرویم.

مقاله مرتبط
NPX چیست؟
راهنمای کامل npx: اجرای سریع بستههای Node.js بدون نصب سراسری، همراه با مثالهای عملی.
ادامه مطلب

