NPM چیست و چه کاربردی دارد؟ – از صفر تا صد
«NPM (Node Package Manager)» نوعی مدیر بسته محبوب برای جاوا اسکریپت است که به طور گسترده برای مدیریت و اشتراکگذاری کتابخانهها و بستههای کد در اکوسیستم «نود جی اس» (Node.js) استفاده میشود. یادگیری NPM نوعی مهارت اساسی در توسعه وب، به خصوص برای کسانی است که از محیط زمان اجرای نود جی اس استفاده میکنند اهمیت زیادی دارد. درک همهجانبه NPM به عنوان نوعی ابزار کاربردی میتواند چالش بزرگی برای تازهکاران باشد. برای شروع کار یادگیری NPM و درک آن در این مطلب از «مجله فرادرس» این بار قصد داریم که اطلاعات مطلوبی در رابطه با اینکه NPM چیست، چه کاربردی دارد، چطور میتوان از آن استفاده کرد و بسیاری از موارد دیگر ارائه کنیم.
NPM چیست؟
NPM، مخفف «Node Package Manager»، هم به عنوان مخزن و هم به عنوان رجیستری که مجموعه گستردهای از بستههای نرمافزاری جاوا اسکریپت را در خود جای داده است، عمل میکند. NPM دارای مجموعهای از ابزارهای خط فرمان است که نصب آسان بستههای مختلف را تسهیل کرده و در عین حال وابستگیهای متقابل آنها را به خوبی مدیریت میکند.
NPM با پایگاه کاربر گستردهای با بیش از ۱۱ میلیون توسعهدهنده در سراسر جهان جایگاه خود را به عنوان نوعی ابزار توسعه وب به خوبی تثبیت کرده است. این ابزار «منبع آزاد» (اوپن سورس |Open Source)، به عنوان مرکز تبادل کد جاوا اسکریپت ظاهرشده و دسترسی به مجموعهای بیش از یک میلیون بسته را ارائه میدهد. در اصل کار NPM را میتوان در دو عملکرد زیر خلاصه کرد:
- مخزن آنلاینی که برای انتشار پروژههای منبع باز Node.js طراحی شده است.
- نوعی ابزار خط فرمان که تعاملات مخازن و بستهها را ساده کرده و فرآیندهای نصب بسته و مدیریت دقیق نسخههای بسته و وابستگیهای مرتبط با آنها را آسان میکند.
نود جی اس چیست؟
Node.js در اصل نوعی محیط زمان اجرا بهحساب میآید که امکان اجرای جاوا اسکریپت در سمت سرور را امکانپذیر میکند. به عبارتی دیگر، نود جی اس نقش و کاربرد معمولی جاوا اسکریپت را که فقط در سمت کلاینت یا سمت کاربر قابل اجرا بود، دگرگون کرده است. برای درک عملکرد و ماهیت Node.js، بهتر است آن را به عنوان نوعی سیستم عامل کوچکتر در نظر گرفت که برای اجرای کارآمد برنامهها طراحی شده است. از لحاظ پیشینه، جاوا اسکریپت به طور اختصاصی برای کار در مرورگرهای وب طراحی شده است. مرورگرها دارای موتور جاسازی شده هستند که مسئول ترجمه کد جاوا اسکریپت به دستورالعملهای قابل خواندن به وسیله ماشین را به عهده دارند.
پشت صحنه یا بکاند کار که لایه پردازش داده برنامه کاربردی را تشکیل میدهد، فاقد این موتور ذاتی بود و با ورد نود جی اس به صحنه بازی این فرایند با تغییر و تحولات زیادی روبهرو شد. این فناوری قابلتوجه به تنهایی به عنوان نوعی موتور جاوا اسکریپت عمل میکند و با ترجمه کد جاوا اسکریپت به دستورالعملهای قابلدرک برای ماشینهای فیزیکی، به طور مؤثر شکاف توسعه سمت بکاند یا سمت سرور را با جاوا اسکریپت پر خواهد کرد. نود جی اس در اصل قابلیتهای زبان جاوا اسکریپت را فراتر از محدودیتهای سمت کلاینت یا مرورگر گسترش میدهد و در واقع در حال حاضر برنامه نویسی سمت سرور با این زبان امکانپذیر شده است.
ارتباط بین نود جی اس و NPM چیست؟
در پاسخ به این پرسش که ارتباط بین نود جی اس و NPM چیست، میتوان گفت که NPM با ردیابی و مدیریت دقیق همه بستههایی که در پروژههای نود جی اس گنجانده شدهاند و اساساً منابع کد مشترک را تشکیل میدهند، نقشی محوری در این اکوسیستم ایفا میکند.
چرا باید از NPM استفاده کرد؟
یکی از سؤالات رایجی که برای کاربران مطرح میشود این است که دلایل استفاده از NPM چیست؟ در حالی که امکان نظارت و مدیریت بستههای کد به صورت دستی وجود دارد اما این کار دارای پیچیدگیهای خاص خود است و با افزایش حجم و پیچیدگی پروژه به کاری سخت و طاقتفرسا تبدیل میشود. NPM به عنوان نوعی ابزار مدیریت بسته، راهحلی ارزشمند برای این مشکل خواهد بود. در اصل NPM برای سادهسازی مدیریت وابستگیها و بستهها در پروژه، ابزاری مناسب است.
روش کار با NPM هم ساده است، برای این کار کاربران تمام وابستگیهای پروژه خود را به طور منظم در فایلی به نام «package.json» کپسوله یا بستهبندی میکنند. در نتیجه، هر زمان که یکی از اعضای تیم شروع به کار با پروژه کرد، دستور، «NPM install» کار نصب وابستگیها را برای او انجام میدهد. این دستور به سرعت تمام وابستگیهای لازم برای پروژه را تهیه و نصب میکند. علاوه بر این، در فایل package.json، این قابلیت موجود است که کاربران نسخههای دقیقی را که پروژه بر آن تکیه دارد، مشخص کنند.
این روش استراتژیک در جلوگیری از اختلالات احتمالی ناشی از بهروزرسانی این بستهها بسیار روشی ارزشمند است که در غیر این صورت امکان دارد یکپارچگی و سازگاری پروژه با مشکلات مواجه شود. در عناوین بالا با نود جی اس، NPM و اینکه ارتباط نود جی اس و NPM چیست آشنا شدیم. در ادامه package.json را با جزئیات بیشتری بررسی خواهیم کرد.
package.json چیست؟
فایل package.json جزئی ضروری از بستههای کد است که به وسیله ابزارهای مدیریت بسته، مانند NPM، تولید میشود و در ریشه پروژهای جاوا اسکریپت - نود جی اس قرار دارد. برای ایجاد فایل package.json میتوان دستور NPM init را اجرا کرد. این دستور درخواستی را آغاز میکند که این درخواست «ابر دادههای» (Meta Data) ضروری را برای پروژه ارائه میدهد. از جمله موارد زیر:
- Name: نام پروژه را مشخص خواهد کرد.
- Version: نسخه در حالت معمولی با فرمت major.minor.patch نشان داده میشود (به عنوان مثال، 1.0.0، 1.2.3).
- Description: شرح مختصری که ماهیت پروژه را روشن میکند.
- License: نوع مجوزی که پروژه تحت آن عمل خواهد کرد را مشخص میکند و تعیین خواهد کرد که دیگران چگونه میتوانند از آن استفاده کنند.
در اصل فایل package.json که در قالب «جیسون» (JSON) ساختار یافته است و به عنوان نوعی مرکز کنترل برای مدیریت جنبههای مختلف پروژه، شامل وابستگیها، اسکریپتها، نسخهها و موارد دیگر عمل میکند. تصویری از جزئیات فایل package.json به صورت زیر است:
در اینجا مثالی ساده برای درک ماهیت آورده package.json شده است:
1{
2 "name": "My Cool Project",
3 "version": "1.0.0",
4 "description": "A description of my project",
5 "main": "index.js",
6 "directories": {
7 "test": "test"
8 },
9 "scripts": {
10 "test": "jest"
11 },
12 "license": "ISC"
13}
این فایل نه تنها اطلاعات حیاتی پروژه را ارائه میدهد، بلکه به عنوان نوعی نقشه راه برای توسعهدهندگان عمل میکند و آن را برای سازماندهی و مدیریت پروژه ضروری خواهد کرد. برای کسی که تازه شروع به کار کرده است، درک فایل package.json در دنیای پروژههای Node.js بسیار مهم است. در ابتداییترین شکل آن، میتوان فایل package.json را به عنوان نوعی طرح اولیه پروژه در نظر گرفت. این فایل به عنوان سند جامعی عمل میکند که جزئیات اساسی پروژه را مشخص کرده و شاملی فهرستی از بستهها و برنامههایی است که پروژه به آنها تکیه میکند.
مثالی از package.json
همانطور که بیان شد در فایل package.json، همیشه ابر دادههای خاصی موجود هستند که به عنوان جزء حیاتی برای هر پروژهای عمل میکنند، خواه برنامه وب، ماژول Node.js یا کتابخانه جاوا اسکریپت باشد این ابر دادهها در آن موجود هستند. اینها ابر دادهها نقش محوری در شناسایی پروژه ایفا کرده و اطلاعات ضروری را برای کاربران و مشارکتکنندگان فراهم میکنند. در اینجا مثالی از نحوه ساختار این فیلدها در فایل package.json آورده شده است:
1{
2 "name": "metaverse",
3 "version": "0.92.12",
4 "description": "The Metaverse virtual reality. The final outcome of all virtual worlds, augmented reality, and the Internet.",
5 "main": "index.js",
6 "license": "MIT"
7}
توجه به این نکته مهم است که فایل package.json برای خوانایی و اطمینان از تجزیه آسان به وسیله ماشین با فرمت JSON ساخته میشود. همچنین ساخت دستی فایل package.json برای پروژه کمی سخت است و برای این هدف دستوری راحت طراحی شده است که تولید package.json را به صورت خودکار انجام میدهد. این دستورالعمل NPM initاست که در ادامه به آن خواهیم پرداخت.
وابستگی های تولید و توسعه در package.json
یکی دیگر از جنبههای مهم فایل package.json نقش آن در مدیریت وابستگیهای پروژه است. وابستگیها شامل ماژولهای اساسی هستند که پروژه برای عملکرد مناسب خود بر آنها متکی است. گنجاندن وابستگیها در فایل package.json پروژه، نصب یکپارچه نسخههای ماژول خاصی را که برای عملیات پروژه حیاتی هستند، تسهیل میکند. با اجرای دستور نصب، پروژه میتواند بدون زحمت تمام وابستگیهای لازم را در package.json تنظیم کند.
وابستگیها به دو دسته مجزا تقسیم میشوند. «وابستگیهای لازم برای تولید» (Dependencies) و «وابستگیهای ضروری برای توسعه» (DevDepenendcies)؛ اما تفاوت این دو وابستگی در NPM چیست؟ در محیط تولید، معمولاً به ابزارهایی برای نظارت بر تغییرات فایل CSS و بازخوانی خودکار برنامه نیازی نیست. با این حال، هم تولید و هم توسعه نیازمند ماژولهایی هستند که اهداف اصلی پروژه را تسهیل میکنند، مانند فریمورکهای وب، ابزارهای API و ابزارهای کدنویسی. بنابراین، package.json پروژه زمانی که شامل Dependencies و DevDependencies باشد چگونه به نظر میرسد؟ برای نشان دادن این موضوع، اجازه دهید مثال قبلی package.json را مورد بررسی قرار دهیم.
1{
2 "name": "metaverse",
3 "version": "0.92.12",
4 "description": "The Metaverse virtual reality. The final outcome of all virtual worlds, augmented reality, and the Internet.",
5 "main": "index.js"
6 "license": "MIT",
7 "devDependencies": {
8 "mocha": "~3.1",
9 "native-hello-world": "^1.0.0",
10 "should": "~3.3",
11 "sinon": "~1.9"
12 },
13 "dependencies": {
14 "fill-keys": "^1.0.2",
15 "module-not-found-error": "^1.0.0",
16 "resolve": "~1.1.7"
17 }
18}
تمایزی مهم بین وابستگیها و سایر بخشهای رایج package.json این است که هر دو بهعنوان شی ساختار یافتهاند و شامل چندین جفت «کلید/مقدار» هستند. هر کلید در Dependencies و DevDependencies نشاندهنده نام بسته است، در حالی که مقدار مرتبط نشاندهنده محدوده نسخه قابل قبول برای نصب، مطابق با قوانین «نسخهسازی معنایی» (Semantic Versioning) است. در ادامه مطلب با مفهوم نسخهسازی معنایی نیز آشنا خواهیم شد.
به صورت کلی تفاوت میان Dependencies و DevDependencies را میتوان در دو نکته زیر خلاص کرد:
- Dependencies: فهرستی از ماژولها یا بستههای ضروری را تشکیل میدهند که پروژه برای اجرای روان به آنها متکی است. بستههایی مانند «Bcryptjs» ،«Cors» ،«Dotenv» و «Express» در این دسته قرار میگیرند.
- DevDependencies: جایی که DEV در آن مخفف وابستگیهای توسعه است و ماژولها یا بستههایی را در برمیگیرد که در عملیات پروژه نیستند. این مؤلفهها در درجه اول فرآیند توسعه را بهبود میبخشند اما به طور ذاتی به عملکرد اصلی پروژه کمک نمیکنند. «Eslint»، «Mocha» و «Prettier»در این دسته قرار میگیرند.
درک پیچیدگیهای وابستگیها بسیار مهم است زیرا به طور بالقوه میتوانند باگها یا آسیبپذیریهای امنیتی مختلفی را وارد پروژه کنند. با درک تمایز بین وابستگیهای تولید و وابستگیهای توسعه، میتوان کنترل بهتری بر عملکرد و گردش کار پروژه ایجاد کرد.
دستورات NPM
هنگام کار با NPM، کاربران عمدتاً از ابزار خط فرمان برای تعاملات خود با آن استفاده میکنند. در این بخش از مطلب به بررسی مهمترین دستورات NPM خواهیم پرداخت تا کاربر درک نسبتاً مطلوبی از این دستورات داشته باشد.
دستور NPM init
دستور NPM initبرای راهاندازی و مقداردهی اولیه پروژه در نظر گرفته شده است و ساختار پروژه را تنظیم میکند. این دستور به ترتیب ملزومات زیر را برای پروژه تنظیم خواهد کرد:
- Name: نام پروژه
- version: نسخه اولیه پروژه
- desctiption: شرح یا توضیحات پروژه
- main: نقطه ورود پروژه (معمولاً فایل اصلی)
- scripts : مجموعهای از اسکریپتهای Node را تعریف میکند که میتوان اجرا کرد. این اسکریپت خود شامل ۳ دستور متفاوت زیر است:
- npm test: برای اجرای تستها
- npm build: برای ساخت پروژه
- npm start: برای اجرای پروژه به صورت محلی
مابقی ملزومات دستور NPM initبه صورت زیر هستند:
- مکان مخزن «Git» برای کد منبع پروژه
- کلمات کلیدی مرتبط با پروژه
- مجوز پروژه (معمولاً به صورت پیشفرض ISC است، اگرچه اکثر پروژههای منبع باز Node.js از MIT استفاده میکنند)
بسیار عالی و جامع توضیح دادین. ممنون از شما