امروزه برنامهنویسی مدرن به استفاده از ابزارها و کتابخانههای آماده تکیه کرده است. برای مدیریت این کتابخانهها در محیط جاوا اسکریپت، ابزاری به نام npm به یکی از ضروریترین وسیلهها برای توسعهدهندگان تبدیل شده است. اما npm دقیقا چیست و چطور کار میکند؟ در این مقاله از بلاگ آسا به این سوال پاسخ میدهیم.
npm چیست؟
npm مخفف Node Package Manager، یک ابزار مدیریت بسته (Package) است که به صورت پیشفرض برای زبان جاوا اسکریپت در محیط Node.js استفاده میشود. این ابزار در واقع بزرگترین مخزن نرمافزار در جهان است. توسعهدهندگان نرمافزارهای متن باز در سراسر دنیا از npm برای اشتراکگذاری و استفاده از بستهها بهره میبرند. همچنین بیشتر سازمانها برای مدیریت پروژههای خصوصی خودشان از npm استفاده میکنند.
در کل npm از سه بخش مجزا تشکیل شده است:
- وبسایت: با استفاده از وبسایت npm میتوانید برای پیدا کردن بستههای مختلف، مدیریت پروفایلتان و مدیریت سایر تنظیمات و شیوههای تعاملتان با npm استفاده کنید. برای مثال میتوانید سازمانهایی (Organizations) ایجاد کنید تا دسترسی به بستههای عمومی و خصوصی را به راحتی مدیریت کنید.
- رابط خط فرمان (CLI): این ابزار از طریق ترمینال اجرا میشود و اصلیترین راه تعامل توسعهدهندگان با npm به حساب میآید.
- مخزن (Registry): مخزن npm یک پایگاهداده بزرگ و عمومی از نرمافزارهای جاوا اسکریپت است. این مخزن همچنین اطلاعات متای مرتبط با این نرمافزارها را در خودش جا داده است.
امکانات و قابلیتهای npm
npm به عنوان بزرگترین و قویترین ابزار مدیریت بسته، امکاناتی فراتر از نصب و بهروزرسانی کتابخانهها در اختیارتان قرار میدهد. با استفاده از این ابزار میتوانید پروژههای خودتان را سریعتر و کارآمدتر مدیریت کنید. قابلیتهایی مثل اشتراکگذاری کد، مدیریت وابستگیها، ایجاد تیمهای مجازی و استفاده از ابزارهای آماده از جمله امکاناتی هستند که به سادگی میتوانید در npm از آنها استفاده کنید. در ادامه به بررسی دقیقتر این قابلیتها میپردازیم.
۱. تطبیق یا استفاده مستقیم از بستههای کدنویسی
با استفاده از npm، میتوانید بستههای نرمافزاری مختلف را مطابق نیاز خودتان تغییر دهید و به پروژههای خود اضافه کنید. این قابلیت به شما اجازه میدهد تا از کدهای آماده بهینه استفاده کنید یا آنها را مطابق نیاز پروژه خودتان سفارشی کنید. این کار زمان توسعه پروژه را کاهش داده و بهرهوری تیم شما را افزایش میدهد.
۲. دانلود ابزارهای مستقل و استفاده فوری از آنها
npm به شما امکان میدهد تا ابزارهای کاربردی و مستقل را به راحتی دانلود کرده و بلافاصله از آنها استفاده کنید. این ابزارها میتوانند شامل ابزارهای خط فرمان، کتابخانههای کاربردی، یا اسکریپتهای آماده برای بهینهسازی فرآیند توسعه باشند.
۳. اجرای بستهها بدون نیاز به دانلود با استفاده از npx
npx یک ابزار خط فرمان است که همراه با npm نصب میشود. با استفاده از npx، میتوانید بستهها را بدون نیاز به نصب دائمی روی پروژه خود اجرا کنید. این قابلیت برای اجرای سریع ابزارهای آزمایشی یا استفاده موقت از یک ابزار خاص بسیار کاربردی است و از شلوغ شدن پوشه پروژه جلوگیری میکند.
۴. اشتراکگذاری کد با کاربران npm در سراسر جهان
npm بستری قدرتمند برای اشتراکگذاری کد برایتان ایجاد میکند. شما میتوانید کدهای خود را با سایر توسعهدهندگان در سراسر جهان به اشتراک بگذارید و از بازخوردها و مشارکتهای این جامعه متنباز بهره بگیرید. این فرآیند به ارتقای کیفیت کد شما کمک میکند و امکان استفاده از تجربیات دیگران را فراهم میکند.
۵. محدودسازی دسترسی به کدها
اگر روی پروژههای خصوصی کار میکنید، میتوانید با استفاده از قابلیتهای امنیتی npm، دسترسی به کدها را به گروه مشخصی از توسعهدهندگان محدود کنید. این ویژگی برای پروژههای تیمی یا سازمانی بسیار مفید است و امنیت کدها را تضمین میکند.
۶. ایجاد سازمانها برای هماهنگی بهتر
با قابلیت ایجاد سازمانها (Organizations) در npm، میتوانید تیمها و پروژهها را بهتر مدیریت کنید. سازمانها به شما کمک میکنند تا نگهداری بستهها، مدیریت کدنویسی و هماهنگی میان توسعهدهندگان را به طور منظم انجام دهید.
۷. تشکیل تیمهای مجازی با استفاده از سازمانها
ویژگی سازمانها در npm به شما اجازه میدهد تیمهای مجازی از توسعهدهندگان تشکیل دهید که میتوانند از مکانهای مختلف به صورت هماهنگ روی پروژههای مشترک کار کنند. این قابلیت برای پروژههای بزرگ یا توزیعشده بسیار کارآمد است.
۸. مدیریت نسخههای مختلف کد و وابستگیها
یکی از چالشهای بزرگ در پروژههای نرمافزاری، مدیریت نسخههای مختلف یک کد و وابستگیهای آن است. npm این فرایند را با امکاناتی مثل فایل package.json ساده کرده و به شما کمک میکند تا وابستگیها را بدون نگرانی از تداخل نسخهها مدیریت کنید.
۹. بهروزرسانی آسان برنامهها
npm این امکان را در اختیارتان قرار میدهد تا با بهروزرسانی بستههای پایه، برنامههای خود را به سرعت و بدون دردسر بهروزرسانی کنید. این ویژگی از ناسازگاریهای احتمالی جلوگیری کرده و کیفیت پروژه را حفظ میکند.
۱۰. یافتن راهحلهای مختلف برای یک مشکل
در مخزن npm، میلیونها بسته وجود دارد که هر کدام میتوانند راهحل متفاوتی برای یک مشکل یا مسئله مشابه ارائه دهند. این تنوع به شما اجازه میدهد بهترین ابزار را برای پروژه خود انتخاب کنید و نیازهای خاص پروژه را برطرف کنید.
۱۱. کشف توسعهدهندگان با علایق مشابه
Npm فقط یک ابزار نیست؛ بلکه پلی برای ارتباط بین توسعهدهندگان است. شما میتوانید دیگر توسعهدهندگانی را که روی مسائل مشابه کار میکنند شناسایی کنید و با آنها تعامل داشته باشید. این ارتباطات میتوانند به یادگیری بیشتر، بهبود کیفیت کد و گسترش شبکه حرفهای شما کمک کنند.
فایل package.json: شناسنامه پروژه جاوا اسکریپت
هر پروژه در دنیای جاوا اسکریپت چه در محیط Node.js و چه در برنامههای مبتنی بر مرورگر، میتواند به عنوان یک بسته npm با اطلاعات مخصوص به خود تعریف شود. این اطلاعات در فایلی به نام package.json ذخیره میشود که وظیفه توصیف پروژه و مدیریت متادیتاهای مربوط به آن را بر عهده دارد.
اگر بخواهیم package.json را به زبان سادهتر توصیف کنیم، میتوانیم آن را به عنوان برچسبهایی روی بستههای npm در نظر بگیریم که توسط CLI npm به کاربران ارسال میشود.
وقتی دستور «npm init» برای شروع یک پروژه جاوا اسکریپت یا Node.js اجرا میشود، فایل package.json به صورت خودکار ایجاد میشود. این فایل شامل اطلاعات پایهای زیر است که توسط توسعهدهنده مشخص میشود:
- Name: نام کتابخانه یا پروژه جاوا اسکریپت
- Version: نسخه پروژه. اگرچه این فیلد در پروژههای برنامهمحور کمتر استفاده میشود؛ اما در مدیریت نسخهها برای انتشار کتابخانههای متنباز یا شناسایی نسخه اصلی که روی سرور یا محیط نهایی اجرا میشود، میتواند مفید باشد
- Description: توضیح مختصری از پروژه
- License: نوع مجوز پروژه که نشاندهنده حقوق استفاده و اشتراکگذاری آن است
فایل package.json نقش کلیدی در مدیریت پروژههای جاوا اسکریپت بازی میکند و به عنوان مرجعی برای وابستگیها، اسکریپتها و اطلاعات کلی پروژه مورد استفاده قرار میگیرد. در ادامه به چند ویژگی از فایل package.json میپردازیم.
npm scripts
در فایل package.json، ویژگی scripts به شما کمک میکند اسکریپتهایی تعریف کنید که ابزارهای خط فرمانی که در پروژه نصب شده را اجرا کنند. به عنوان مثال:
{
“scripts”: {
“build”: “tsc”,
“format”: “prettier –write **/*.ts”,
“format-check”: “prettier –check **/*.ts”,
“lint”: “eslint src/**/*.ts”,
“pack”: “ncc build”,
“test”: “jest”,
“all”: “npm run build && npm run format && npm run lint && npm run pack && npm test”
}
}
در اینجا ابزارهایی مثل prettirer، eslint و jest به صورت لوکال در پوشه /node_modules/.bin نصب شدهاند و نیازی به نصب گلوبال آنها نیست. همچنین با استفاده از دستور «npx» میتوانید این ابزارهای لوکال را درست مثل یک ابزار گلوبال اجرا کنید. مثلا:
npx prettier –write **/*.ts
بخشهای devDependencies و dependencies
این دو بخش در فایل package.json نشاندهنده وابستگیهای پروژه هستند که به صورت زیر تعریف میشوند:
- Dependencies: شامل کتابخانههایی است که برای اجرای پروژه در محیط تولید (production) ضروری هستند.
- devDependencies: شامل ابزارها و کتابخانههایی است که برای توسعه و تست پروژه استفاده میشود.
برای نصب این وابستگیها از دستور «npm install» استفاده میشود:
- «–save» برای dependencies
- «–save-dev» برای devDependencies
نمونهای از این بخش را ببینید:
{
“dependencies”: {
“@actions/core”: “^1.2.3”,
“@actions/github”: “^2.1.1”
},
“devDependencies”: {
“eslint”: “^6.8.0”,
“jest”: “^25.1.0”,
“typescript”: “^3.8.3”
}
}
نشانههایی مثل «^» و «~» در نسخهها به ترتیب نشاندهنده نستخههای جزئی (minor) و وصلهای (patch) هستند. مثلا اگر نسخهای به صورت ^۱.۰.۴ مشخص شده باشد، ممکن است نسخه ۱.۳.۰ نصب شود، البته به شرطی که این نسخه آخرین نسخه جزئی در سری اصلی ۱ باشد. مشابه «^» برای نسخههای جزئی، اگر نسخهای به صورت ~۱.۰.۴ مشخص شده باشد، ممکن است نسخه ۱.۰.۷ نصب شود، البته به شرطی که این نسخه آخرین نسخه وصلهای در سری جزئی ۱.۰ باشد.
تفاوت package.json و package-lock.json چیست؟
فایل package-lock.json اطلاعات دقیقی از نسخههای واقعی وابستگیهای پروژه را در خود ذخیره میکند. اگر package.json به صورت کلی وابستگیها را مشخص کند، package-lock.json نسخه دقیق هر وابستگی را برای اطمینان از سازگاری ذخیره میکند. این فایل توسط دستور npm install ایجاد شده و توسط ابزار CLI npm برای بازتولید محیط پروژه با دستور «npm ci» خوانده میشود.
میتوان این فایل را مثل جدول مواد تشکیلدهنده یک محصول تصور کرد که توسط توسعهدهندگان معمولا بررسی نمیشود، مگر زمانی که نیاز به رفع مشکلات ناسازگاری بین دستگاههای مختلف باشد.
دستورات کاربردی در npm
npm یک مجموعه از دستورات کاربردی را در اختیارتان میگذارد که فرآیند توسعه و نگهداری پروژهها را سادهتر و کارآمدتر میکند. این دستورات از نصب و بهروزرسانی بستهها تا مدیریت نسخهها و اجرای وظایف، به شما کمک میکنند تا پروژههای خود را با دقت و کارآمدی بیشتری مدیریت کنید. در این بخش، به معرفی مهمترین دستورات npm و کاربردهای آنها میپردازیم.
نصب بسته
برای نصب یک بسته خاص میتوانید از دستور زیر استفاده کنید:
npm install <package-name>
برای مثال برای نصب React، دستور زیر را استفاده میکنیم:
npm install react
از نسخه ۵ به بعد، این دستور به صورت خودکار نام بسته را به بخش dependencies فایل package.json اضافه میکند. در نسخههای قبل از ۵، باید از فلگ «–save» استفاده میکردید.
این دستور میتواند با فلگهای زیر هم ترکیب شود:
- –save-dev: بسته را نصب کرده و به بخش devDependencies اضافه میکند
- –no-save: بسته را نصب میکند ولی آن را به فایل package.json اضافه نمیکند
- –save-optional: بسته را نصب کرده و به بخش optionaldependencies اضافه میکند
- –no-optional: از نصب وابستگیهای اختیاری جلوگیری میکند
وابستگیهای نوع optionaldependencies اگر در هنگام نصب دچار خطا شوند، باعث شکست نصب کل پروژه نمیشوند. با این حال، مسئولیت مدیریت عدم وجود این وابستگیها بر عهده برنامه توسعهدهنده خواهد بود.
همچنین میتوانید از نسخه کوتاهشده فلگها استفاده کنید:
- -S: معادل –save
- -D: معادل –save-dev
- -O: معادل –save-optional
بهروزرسانی بستهها
اگر فایل package.json در پروژه ایجاد شده باشد، برای بهروزرسانی تمامی بستههای پروژه به نسخههای جدیدتر از دستور زیر استفاده کنید:
npm install
با اجرای این دستور تمام وابستگیهای مورد نیاز پروژه نصب میشوند و در پوشه node_modules قرار میگیرند. اگر این پوشه وجود نداشته باشد، npm به صورت خودکار این پوشه را ایجاد میکند.
همچنین میتوانید یک بسته خاص را با استفاده از دستور زیر بهروزرسانی کنید:
npm update <package-name>
در دستور بالا به جای <package-name>، میتوانید نام بسته مورد نظر خود را برای بهروزرسانی بنویسید. مثلا:
npm update react
نسخهگذاری (Versioning)
npm از استاندارد نسخهگذاری معنایی (Semantic Versioning) پشتیبانی میکند. با این قابلیت میتوانید نسخه خاصی از یک بسته را نصب یا محدودیتهایی بر روی یک نسخه اعمال کنید.
در موارد زیر نسخهگذاری اهمیت پیدا میکند:
یک کتابخانه فقط با یک نسخه از کتابخانه دیگر سازگار است.
مشکلی در نسخه جدید یک کتابخانه وجود دارد و باید از نسخه قبلی استفاده کنید.
اطمینان از اینکه همه اعضای تیم از یک نسخه استفاده میکنند تا سازگاری حفظ شود.
برای نصب نسخه خاصی از یک بسته از دستور زیر استفاده کنید:
npm install <package-name>@<version>
برای مثال فرض کنید میخواهیم نسخه مشخصی از React، مثلا نسخه ۱۷.۰.۱ را نصب کنیم. در نتیجه دستور بالا را به شکل زیر مینویسیم:
npm install react@17.0.1
این دستور دقیقا نسخه ۱۷.۰.۱ از React را نصب میکند و آن را به بخش dependencies در فایل package.json اضافه میکند. همچنین نسخه نصبشده در فایل package-lock.json هم ثبت میشود.
اجرای وظایف (Tasks)
همانطور که گفتیم فایل package.json این امکان را در اختیارتان قرار میدهد که خطوطی از فرمانهای مختلف تعریف کنید و با دستور زیر آنها را اجرا کنید:
npm run <task-name>
این قابلیت بیشتر برای اجرای وظایف ابزارهایی مثل Webpack استفاده میشود. به عنوان مثال:
{
“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 تعریف میشود:
- watch: برای نظارت بر تغییرات فایلها و اجرای خودکار Webpack
- dev: برای اجرای Webpack در حالت توسعه
- prod: برای اجرای Webpack در حالت تولید (production)
به جای تایپ کردن دستورات طولانی و پرخطا، میتوانید به سادگی از دستورات کوتاه زیر استفاده کنید:
npm run watch
npm run dev
npm run prod
این وظایف به توسعهدهندگان کمک میکند فرآیندهای تکراری مثل ساخت، تست یا فرمتدهی کد را به صورت خودکار اجرا کنند.
سخن آخر
npm نه تنها یک ابزار کاربردی برای مدیریت بستهها است، بلکه با ویژگیهای خلاقانه و جامعه کاربری فعالش، یکی از پایههای اساسی توسعه مدرن جاوا اسکریپت شناخته میشود. قابلیتهایی مثل نصب و بهروزرسانی آسان بستهها، تعریف وظایف و مدیریت نسخهها فرآیند توسعه پروژهها را سادهتر و کارآمدتر میکند. در کل بهرهگیری از npm به معنای صرفهجویی در زمان و افزایش دقت در مدیریت پروژهها است.
سوالات متداول
۱. NPM چیست و چه کاربردی دارد؟
۲. پکیج گلوبال چیست و چه زمانی باید از آن استفاده کرد؟
۳. تفاوت بین devDependencies و dependencies چیست؟
منابع:
دیدگاهتان را بنویسید