اگر پروژه ما بطور همزمان، به چند نسخه از یک پکیج وابسته باشد، چهطور این تفاوت نسخه ها را مدیریت میکند؟ آیا npm تمام این نسخه ها را نصب میکند؟در این مقاله یاد میگیریم که هر یک از این نسخه ها کجای برنامه قرار میگیرند و npm برای مدیریت چنین تداخلی، از چه قانونی پیروی میکند.
تکراری بودن نیازمندیها
تصور کنید پروژهای داریم که پکیجهای زیادی را بعنوان نیازمندی، در قسمت dependencies فایل package.json
دارد. میدانیم که این پکیجها هر کدام برای خود فایل package.json
دارند و پکیجهایی را در آن بعنوان نیازمندی خود مشخص کردهاند، و این سلسله تکرار میشود و در مجموع، درخت نیازمندیهای پروژه شکل میگیرد. وقتی در پروژه دستور npm install
را اجرا میکنیم، npm تمامی این نیازمندیها را در فولدرِ node_modules بصورت سطحی(همه نیازمندیها sibling یکدیگر در همین فولدر، و نه بصورت عمقی و تو در تو) نصب میکند. پس از اجرای این دستور، اگر به فولدر node_modules مراجعه کنیم، میبینیم که هر کدام از نیازمندیهای پروژه، یک فولدر در node_modules به خود اختصاص دادهاند. حال فرض کنید پروژهای داریم که تنها دو پکیج A و B نیازمندیهای آن هستند. هر دوی این پکیجها، خود نیازمندِ پکیج C هستند. اگر هر دو به نسخه یکسانی از C نیاز داشته باشند:
پس از اجرای دستور npm install
، محتوای node_modules به این ترتیب خواهد بود:
همانطور که مشاهده میکنیم، پکیج C بصورت سطحی و بعنوان sibling سایر پکیجها نصب میشود. اگر درون هر یک از فولدرهای A و B را ببینیم، هیچکدام فولدر node_modules ندارند.
اما اگر A و B به نسخه متفاوتی از C نیازمند باشند:
پس از اجرای npm install
محتوای node_modules به این شکل خواهد بود:
یعنی تنها یکی از نسخههای C بعنوان sibling بقیه نصب میشود (version 1)، و نسخه دیگر در فولدرِ node_modules فولدری نصب میگردد که مربوط به پکیج وابسته به آن است (version 2).
زمانی که تعداد پکیجهای وابسته به نسخههای مختلف C بیش از دو تا باشد نیز همین قاعده برقرار خواهد بود. یعنی تنها یک نسخه از پکیج بصورت سطحی نصب میشود(آنکه زودتر دانلود میشود) و بقیه نسخهها در فولدر node_modules پکیج وابسته به آنها نصب میگردد. برای درک بهتر این موضوع، ویدیوی موجود در آدرس زیر کمک کننده خواهد بود:
https://www.youtube.com/watch?v=5WlWue-Aero
یکی از مهمترین توانایی هایی که باید بعنوان برنامه نویس داشته باشیم، این است که بتوانیم نیازهای پروژه مان را با مراجعه به منابع مختلف برطرف کنیم. در پروژه خود از پکیج های آماده مناسب استفاده کنیم، مستندات مربوط به تکنولوژی های مورد استفاده مان را مطالعه کنیم و نحوه کار کردن با آنها و روش یافتن پاسخ سؤالاتمان را بدانیم.
در دنیای جاوااسکریپت و وقتی با npm سر و کار داریم، یکی از مهمترین این منابع وبسایت رسمی npm است:
در مقاله بعد، می آموزیم که وقتی به صفحه مربوط به یک پکیج خاص در وبسایت npm می رویم، چه اطلاعاتی به دست می آوریم. پس همچنان با ما باشید...