17. مدیریت پکیج ها در Node.js

در نوشته های قبلی با ماژول ها و کامپوننت ها آشنا شدیم و گفتیم:

ماژول : یک فایل JS که شامل تعدادی تابع می باشد.
کامپوننت : هر تابع داخل ماژول یک کامپوننت می باشد.
پکیج : به مجموعه ای از یک یا چند ماژول ها که کار به خصوصی رو انجام می دهند یک پکیج گفته می شود.

توضیح کامل تر و دقیق تر در لینک زیر:

https://docs.npmjs.com/about-packages-and-modules

در واقع پکیج یک دایرکتوری ، شامل یک یا تعدادی ماژول می باشد ، به همراه یک فایل Package.JSON. یکی از مشخصه های اصلی پکیج همین فایل Package.json هست. اما در مقابل ماژول یک فایل JS مجزا می باشد که می تواند در سایر ماژول ها require شود و مورد استفاده قرار گیرد.

نکته ای درباره require کردن ماژول :
اگر ماژول را در پوشته node_modules قرار دهید موقع require کردن کافیه فقط اسم فایل رو ذکر کنید
var req = require('request')
اما اگر در مسیر دیگری قرار دارد باید مسیر را نیز ذکر کنید:
var req = require('./request')

در طول پروژه شما نیاز به استفاده از پکیج های متنوعی خواهید داشت. در هنگام نصب node.js برنامه node.js package manager نیز نصب شده است (یا همون NPM) که برای نصب ، حذف ، اپدیت و کلا مدیریت پکیج های برنامه ازش استفاده خواهیم کرد. قبلا هم در همین آموزش ها با دستوراتی مثل

npm install mysql

برخورد کرده بودیم که برای نصب پکیج mysql استفاده می شد. اما لازم هست کمی توی مبحث مدیریت پکیج ها عمیق تر شویم.

نصب پکیج ها :

فرض بفرمایید در برنامه ی خود نیاز به استفاده از یک پکیج داریم. بعد از پیدا کردن اسم پکیج با دستوری که قبلا هم نیز با آن مواجه شده ایم ، برنامه را نصب میکنیم:

npm install mysql

با اجرای این کد ، فایل های مربوط به پکیج ، دانلود شده و در پوشه node_modules ذخیره می شود و شما قادر خواهید بود از این پس با require کردن پکیج مورد نظر ، از امکانات آن استفاده کنید.

اگر دستور بالا را در هنگام نصب اجرا کنید ، پکیج نصب خواهد شد ، اما اطلاعات آن در فایل package.json برنامه شما ثبت نخواهد شد. کاربرد اصلی این فایل چیست؟ به این موضوع در ادامه پرداخته خواهد شد.

برای ثبت اطلاعات پکیج نصب شده در فایل package.json باید در هنگام نصب از یکی از دستورات زیر استفاده کنید:

npm install mysql --save
npm install mysql --save -dev

دستور اول برای پکیج هایی که در حالت production مورد نیاز می باشند.

دستور دوم فقط برای پکیج هایی که در زمان develop به آن ها نیاز خواهیم داشت.

نکته : ممکن است اگر برای اولین بار از دستور save استفاده میکنید ، با خطایی مبتنی بر عدم وجود فایل package.json مواجه شوید ، لازم است قبل از استفاده از دستور save با دستور زیر فایل package.json را ایجاد کنید:

npm init

وقتی در هنگام نصب پکیج از دستور save استفاده کنید ، فایل package.json به شکل زیر تغییر شکل خواهد داد:

همانطور که مشاهده می کنید ، در بخش dependencies تمام پکیج های مورد استفاده به همراه ورژن آن ها در این فایل ثبت شده است. اما کاربرد این فایل چیست؟

وقتی شما قصد دارید برنامه خود را به سرور دیگری منتقل کنید ، نیازی به انتقال پوشه node_modules ندارید( این پوشه شامل تعداد زیادی پکیج می باشد و حجم بالایی دارد). در عوض فقط کافی است فایل package.json را به سرور منتقل کنید و سپس با استفاده از دستور npm install ، تمام پکیج های موردنیاز ثبت شده در فایل package.json با ورژن مناسب ذکر شده نصب خواهند شد.

همچنین در صورت نیاز با دستور npm update قادر به اپدیت پکیج ها خواهید بود.

شاید سوالی پیش بیاید که ما فقط چهار پکیج نصب کرده ایم ، اما چرا پوشه node_module بیش از چهار پوشه دارد و اینقدر شلوغ است؟

وقتی شما برای مثال پکیج mysql را نصب میکنید ، خود این پکیج (مانند برنامه شما) یک فایل package.json دارد. که در آن ذکر شده است پکیج mysql چه وابستگی هایی دارد و برای کار کردن نیاز به کدام پکیج ها دارد. که نیاز می باشد آن پکیج ها نیز همراه mysql نصب شوند. تمام وابستگی های mysql نیز به نوبه خود دارای فایل package.json و وابستگی های خاص خود می باشند.

به این ترتیب ساختار وابستگی های پکیج ها به هم به صورت درختواره ای می باشد و می توانید با دستور npm list --depth =2 این ساختار را تا عمق دو یا بیشتر مشاهده کنید.

نکته آخر اینکه در فایل package.json در ابتدای ورژن ها عبارت ^ ذکر شده است که به معنی این است که : در مجاز به اپدیت patch و minor ورژن ها می باشد. اگر به جای آن از علامت ~ استفاده شود تنها patch را اپدیت می کند.