ان‌پی‌ام(NPM) در +1500 کلمه!

درود!این مقاله قراره توی بیش‌تر از 1500 کلمه شما رو با چیستی NPM و دستورات پایه اون آشنا کنه.ان‌پی‌ام(NPM) چیه؟مخفف Node Package Manager هستش و یه ابزار هست که همراه با Node.js نصب میشه و برای مدیریت پکیج ها(لایبرری ها و فریمورک ها) توی جاوااسکریپت هست که هم توی محیط Browser و هم توی محیط Node استفاده میشهمدیریت یعنی چی دقیقا؟یعنی نصب، حذف، ارتقا و مدیریت نسخه های یه پکیجچطوری نصبش کنم؟همونطور که بالاتر هم گفتم وقتی شما Node.js رو نصب میکنید، NPM هم باهاش نصب میشه، برای اینکه چک کنید که نصب شده یا نه کافیه cmd یا ترمینال رو بازکنید و دستور npm -v که در واقع مخفف npm --version هست رو بزنید، اگر توی خروجی یه مقدار براتون چاپ کرد یعنی به درستی نصب شده.تبریک شما اولین قدم برای یادگیری NPM رو برداشتید??چطوری ازش استفاده کنیم؟!اکثر اتفاقات توی یه فایلی به اسم package.json میوفته که برای ایجادش باید از دستور npm init استفاده کنید وقتی این دستور رو زدید یه سری سوال میپرسه تا بتونه بخشای اصلی فایل رو براتون بسازه.نکته: توی هر مرحله یه مقدار پیش فرضی وجود داره که اگه میخواید ازش استفاده کنید فقط کافیه enter رو بزنید(توجه کنید مقداری رو وارد نکرده باشید براش)چه سوالایی؟پکیج‌نِیم(package name): اسم پروژتونورژن(version): نسخه پروژهدیسکریپشن(description): توضیحات پروژهاِنتری‌پوینت(entry point): محل شروع پروژتون (فایل اصلی پروژه که همه چی از اون شروع میشه مثلا فایل server.js توی پروژه های Node.js)تست‌کامند(test command): دستوری که برای اجرای تست های پروژه به کار میرهگیت‌ریپازیتوری(git repository): ریپازیتوری مربوط به پروژهکی‌وردز(keywords): کلمه های کلیدی پروژهآذِر(author): نویسنده(سازنده) پروژهلایسِنس(license): گواهینامه پروژهتوی مرحله آخر هم یه پیشنمایش از تنظیماتتون رو نمایش میده و میپرسه این تنظیمات درسته؟ که پیشفرضش yes هست و اگه enter رو بزنید فایل package.json با موفقیت ساخته میشه!نکته: تمامی مقادیر بعد از ایجاد فایل package.json قابل تغییر هست.اگر میخواید فایل package.json بدون پرسیدن این سوالا ساخته بشه و میتونید از npm init -y که درواقع مخفف npm init --yes هست استفاده کنید.اگر با ارور زیر مواجه شدید بخاطر اینه که پروژتون توی یه پوشه هست که بین کلماتش فاصله هست که این برای NPM یه اسم نامتعبره و باعث میشه فایل package.json ساخته نشه، اما راه حلش چیه؟ این که بجای فاصله از - استفاده کنید توی اسم پوشتون!اگه با این پیام رو به رو شدید یعنی با موفقیت فایلمون ساخته شده.همونطور که دیدید وقتی میخواستیم init کنیم یه سری مقادیر به صورت پیشفرض در نظر گرفته میشد، حالا یه سوال چطوری اونا رو عوض کنیم؟!اول بذارید ببینیم چه تنظیماتی رو میتونیم عوض کنیمبرای اینکه لیست چیزایی که میتونید تغییر بدید رو ببینید از npm config ls -l استفاده کنید.خب اما چطوری تغییرشون بدیم؟!مثلا من میخوام نام سازنده پیشفرض یه پروژه رو تغییر بدم، چیکار باید بکنم؟npm config set init-author-name &quotMohammad MohammadAlian&quot یا npm set init-author-name &quotMohammad MohammadAlian&quotخب همونطور که فهمیدید بعد از npm set یا npm config set باید اسم اون تنظیمی که میخواید رو بنویسید و بعدش مقداری که میخواید بدید رو بین دو تا " بذاریم.برای تغییر لایسنس پیشفرض هم همینطور عمل میکنیم.npm config set init-license &quotMIT&quot یا npm set init-license &quotMIT&quotحالا اگه یبار دیگه npm init --yes رو بزنم فایلی که ساخته میشه با مقادیری که ما دادیم پر شده.حالا یه سوال دیگه، چطوری میتونیم مقدار یکی از این تنظیمات رو بگیریم؟npm config get init-author-name یا npm get init-author-nameچطوری یه پکیج نصب کنم؟ْخب هر پکیجی که شما نصب میکنید یا یه پیش‌نیاز عادی برای پروژست(که برای کار کردن کدای پروژه لازمه) و یا یه پیش‌نیاز که فقط برای توسعه اون پروژست و برای اجرا بهش نیازی نیست(مثلا live-server که یه پکیج برای اینه که وقتی کدا رو تغییر دادیم خودش اتوماتیک رفرش کنه مرورگر رو و ما هی لازم نباشه رفرش کنیم صفحه رو)به پیش‌نیاز های عادی میگن dependency و به پیش‌نیاز های توسعه میگن dev dependencyچطوری یه پکیج رو به عنوان پیش‌نیاز عادی نصب کنم؟اول از همه ما باید پکیجی رو که میخوایم نصب کنیم چک کنیم توی ریپازیتوری NPM باشه، برای اینکار فقط کافیه اسمش رو سرچ کنیم مثلا من میخوام پکیج jsonwebtoken که برای ساختن توکن های JWT هست رو نصب کنم، پس اسمش رو سرچ میکنم و اگه یه پکیج بود که جلوش نوشته بود exact match(یعنی دقیقا اسمش همونیه که سرچ کردی) یعنی این پکیج توی ریپازیتوری npm هستش و میتونیم با یه دستور ساده نصبش کنیمبرای نصب به عنوان پیش‌نیاز عادی میتونید از دستورای زیر استفاده کنیدnpm install jsonwebtoken --save npm i jsonwebtoken --save npm install jsonwebtoken npm i jsonwebtokenنکته:‌ گذاشتن سوییچ save برای پیش‌نیاز های عادی الزامی نیست.چطوری یه پکیج رو به عنوان پیش‌نیاز توسعه نصب کنم؟برای نصب این پکیج ها هم مثل پیش‌نیاز های عادی لازمه که مطمئن بشیم که توی ریپازیتوری NPM وجود داشته باشه، من الان میخوام پیکج jest رو که برای نوشتن تست برای کدامون هست رو نصب کنمبرای نصب به عنوان پیش‌نیاز توسعه از دستورای زیر میتونید استفاده کنیدnpm install jest --save-dev npm i jest --save-dev npm install jest -D npm i jest -Dحالا بریم یه نگاه به پوشه پروژمون بندازیم ببینیم چه تغییراتی اتفاق افتادههمونطور که میبینید یه پوشه به اسم node_modules اضافه شده که توی اون فایل های مربوط به پکیج های نصب شدمون + dependency هاشون توش هست و یه فایل دیگه به اسم package-lock.json که توی اون علاوه بر اطلاعات پکیجایی که خودمون نصب کردیم اطلاعات پکیج هایی که پکیج های ما استفاده کردن هم هست!اما فایل package.json چه تغییری کرده؟همونطور که مشخه یه بخش dependencies و یه بخش devDependencies اضافه شده که توی اونا اسم پکیجا + نسخشون هست.نسخه بندی پکیج ها به چه شکله؟همونطور که توی تصویر مشخصه نسخه پکیج ها از سه بخش تشکیل شده که اولین قسمت از سمت چپ نسخه اصلی پکیج هست و وقتی مثلا از 3 به 4 تغییر پیدا کنه یعنی یه سری تغییرات عمده داشته و احتمال اینکه کدای قبلی کار نکنه خیلی زیاده، دومین قسمت یعنی minor version که تغییر بکنه یعنی یه سری تغییرات کوچیک اعمال شده و شاید چند تا ویژگی جدید اضافه شده ولی باعث نمیشه که کدای قبلی کار نکنن و قسمت آخر یعنی patch برای اصلاح باگ توی کدها هست و ویژگی جدیدی به کد اضافه نشده البته ممکنه یه سری توسعه دهنده تازه کار این عددا رو همینجوری دلی وارد بکنن و به قانون ها و قواعد احترامی نذارناون علامت اول نسخه پکیج برای چیه؟برای اینه که به npm بگیم وقتی دستور npm update رو زدیم تا چه حد میتونی آپدیتش کنی! به صورت پیشفرض روی ^ هست که یعنی میتونی تا minor version آپدیت کنی پس اگه 8.5.1 هست میتونی تا جایی که 9 نشده آپدیتش کنی مثلا به 8.9.9 آپدیتش کنی.اگه اون رو به ~ تغییر بدیم یعنی فقط patch ها رو بگیر مثلا بکن 8.5.9 و اگه کلا نسخه رو پاک کنیم و * بذاریم یعنی هرچه بادا باد، به آخرین نسخه آپدیت کن!(خیلی خطرناکه، توی پروژه های جدیتون ازش استفاده نکنید)چطوری یه پکیج رو آپدیت کنم؟بالا خیلی ریز گفتم با دستور npm update، که درواقع تمام پکیج ها رو آپدیت میکنه ولی اگه بخواید یه پکیج خاص رو آپدیت کنید از دستور npm update packagename استفاده کنید تا فقط یه پکیج خاص رو آپدیت کنید.چطوری یه نسخه خاص از یه پکیج رو نصب کنم؟موقع نصب کافیه با گذاشتن @ بعد از اسم پکیج و نوشتن نسخه اون پکیج رو نصب کنیدnpm i express@4.0.0چطوری یه پکیج رو حذف کنم؟با دستورهای زیر میتونید یه پکیج مثل express رو حذف کنیدnpm uninstall express npm un express npm remove express npm rm expressنکته: اگه یه پکیج به صورت devDependency نصب شده برای حذفش هم باید از سوییچ save-dev استفاده کنیدnpm un jest -Dنکته:‌ هیچ فرقی بین npm uninstall و npm remove نیست.پکیج های گلوبال چطور مدیریت میشن؟تا الان تمام پکیجایی که نصب و مدیریت کردیم لوکال بود و محدود به همون پروژه اما یه سری پکیج مثل nodemon یا live-server هستن که برای استفاده ازشون باید گلوبال نصب کرد یعنی بتونیم توی کل سیستم بهشون دسترسی داشته باشم برای اینکار فقط کافیه سوییچ global رو اضافه کنیم به دستورمونnpm i nodemon --global npm i nodemon -g npm rm nodemon -g ....اگه میخواید بدونید این پکیجا کجا نصب میشن از دستور npm root استفاده کنیدچطوری لیست پکیج ها رو ببینم؟npm listهمونطور که توی عکسم مشخصه این دستور پیش‌نیاز های پکیجایی که نصب کردیم رو هم نشون میده برای این که فقط پکیج هایی که ما مستقیما نصب کردیم رو نشون بده از دستور زیر استفاده می‌کنیمnpm list --depth 0امنیت!یکی از شیوه های خیلی مرسومی که پروژه ها باهاش هک میشن استفاده هکرها از باگ های امنیتی پکیج هایی که استفاده میکنن هست، npm یه قابلیت خوب بهمون داده که بتونیم باگ های امنیتی پیدا شده توی پکیج هامون رو ببینیم و اونا رو به سادگی یه دستور fix کنیمنمونه ای از یه پکیج دارای مشکل امنیتیاما چطوری مشکلات امنیتی رو رفعش کنیم؟npm audit fixاسکریپتاسکریپت یعنی یه برنامه که ساخته میشه تا از کاری تکراری جلوگیری کنه، دقیقا دلیل وجود قسمت scripts توی package.json هم همین هست، میتونیم یه سری دستور تعریف کنیم تا بجای یه سری دستورای طولانی تر اجرا بشن!برای اجرای اسکریپت توی npm از دستور npm run استفاده میکنیمهمونطور که میبینید وقتی میزنیم که اجرا کنه خودش مینویسه که در واقع با اجرای این اسکریپت داره چه دستوری اجرا میشه.البته توی npm یه سری ای اسکریپت ها رو میشه بدون نوشتن run هم اجرا کرد مثلا اسکریپت test یا startانتقالاگه خواستید پروژه رو به بقیه بدید تا اجرا کنن و ازش استفاده کنن لازم نیست پوشه node_modules رو هم بهشون بدید ولی حتما فایل package.json رو بهشون بدید تا بتونن با زدن دستور npm install پکیجای اون رو نصب کنن!دمتون گرم که مقاله رو تا آخرش خوندید، حتما حتما نظراتتون رو بگید و اگه خوشتون اومد لایک کنید و از به اشتراک گذاشتنش با دیگران دریغ نکنید?