ان‌پی‌ام(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 پکیجای اون رو نصب کنن!


دمتون گرم که مقاله رو تا آخرش خوندید، حتما حتما نظراتتون رو بگید و اگه خوشتون اومد لایک کنید و از به اشتراک گذاشتنش با دیگران دریغ نکنید?