بررسی package.json و package-lock.json

به عنوان توسعه دهنده فرانت اند یا Frontend developer اگر از NPM استفاده کرده باشین حتما با این دو فایل روبرو شدین. اما اینا به چه کارمون میان و چرا بهشون نیاز داریم؟فایل Package.json چیه؟این فایل مرکز اصلی و قلب پروژه‌مونه که تمام وابستگی یا dependency هامون رو به همراه ورژن نصب شدشون رو میتونیم توش ببینیم (البته اجرای دستوراتمون مثل Command های پیشفرض هم توی این فایل تعریف میشن)فایل Package-lock.json چیه؟این همون فایلیه که تمام نسخه های نصب شده و وابستگی هایی که همراه با پکیج های نصب شده روی پروژه مون نصب شدن رو میتونیم توی این فایل ببینیم و به توسعه دهنده های دیگه هم کمک میکنه که برای همکاری توی پروژه تون تمام پکیج ها و وابستگی های این پکیج هارو ببینن.فکر کنم به همین اندازه ازشون بدونیم زیادی هم باشه ??حالا بیایم یکم توی این فایلا عمیق تر بشیم و نحوه عملکردشون رو بررسی کنیم...فرض کنید یه پروژه رو استارت زدین و برای نصب بسته ها از NPM استفاده کردین، اگر دیده باشین وقتی که NPM کارشو شروع میکنه به همراهش دوتا فایل هم تولید میشه که بحث امروزمونهبیاین یه پکیج رو با npm نصب کنیمnpm i bootstrapبعنوان نمونه ما پکیج بوت استرپ رو نصب میکنیمحالا توی مسیر پروژه دوتا فایل برامون ایجاد به همراه پوشه node_moduleتوسعه دهنده های دیگه برای استفاده از پروژه شما به دو چیز نیاز دارن:1- دقیقا همین فایل ها (package.json , package-lock.json)2- پکیج های نصب شده با ورژنی دقیقا مطابق فایل شماحالا میتونی تمام فایل های پروژه ات رو به همراه پوشه node_module یه فایل zip کنی و به همکارت یا کسی که کنارته تحویل بدیامااااااااااااااااااااااااا ⚠️داستان از اینجا شروع میشه که شما قراره این فایل هارو به شخصی دیگه ای تو یه مکان دیگه بدین و حجم پکیج های نصب شدتون هم به شدت زیاد و سنگینه خب ما چیکار باید بکنیم؟ ?خیلییی ساده کافیه تمام فایل های پروژه ات رو بجزززززز پوشه node_module یه فایل زیپ کنی و به اون شخص تو یه مکان دیگه بدین (البته اگه توی گیت هاب و گیت لب و .... کدهاتون رو قرار نمیدین)ایجوری میبینی که حجم فایل هات شاید 1 مگابایت یا کمتر بشه (مگه حجم اضافی رو عکس و مدیاهات بگیرن)قطعا اشتراک گذاری یه فایل 1 مگابایتی خیلی راحت تر از فایل 50 مگابایتی هستتنها کاری که اون شخص باید بکنه اینه که فایل هارو ازتون بگیره وتوی ترمینالش دستور npm رو بدهnpm installحالا اونم دقیقا همون پروژه شما با همون پکیج و ورژن هارو دارهاما node از کجا میدونست باید چه چیزایی رو نصب کنه؟؟؟ ?معلومه بخاطر وجود فایل های package.json , package-lock.jsonآیا به هر دو package.json و package-lock.json نیاز داریم؟جواب نه هست!قطعا با داشتن فقط فایل package.json هم امکان نصب هست اماااااا پس چه نیازی به package-lock.json داشتیم؟؟؟؟؟؟?برای درک این موضوع اول باید مفهوم علامت های ~ و ^ را بدانیم که توی فایل package.json قبل از شماره ورژن پکیج نصب شده قابل مشاهدسعلامت ^ یعنی قسمت patch و minor پکیج رو آپدیت کنعلامت ~ یعنی فقط قسمت patch پکیج آپدیت بشهتو مثال بالا ورژن پکیج بوت استرپ ما 5.2.3 هستش و قبلش علامت ^ اومدهاین اعداد چی رو نشون میدن ؟5 => major2 => minor3 => patchپس طبق علامت قبل ورژن توی بوت استرپ باید برای ما بعد از اپدیت پکیج فقط بخش ورژن 2.3 تغییر میکنه و 5 ثابته ( در ارتباط با این چیزا داکیومنت npm رو بخونید)تا همینجا دونستن هم برای درک این مطلب کافیه ?حالا بدون فایل package-lock به همکارتون بگین نصب رو شروع کنه، بدون هیچ مشکلی همه پکیج ها نصب میشن و یه فایل package-lock جدید هم براش ایجاد میشهاما مشکلی که داریم اینه که اگر فایل package.json شما توش ورژن پکیجی "5.2.3^" یا "5.2.3~" باشه وقتی همکارتون دستور npm install رو میدهتا وقتی که نسخه های نصبی پکیج شما بروز باشن هیچچچچ مشکلی برای همکارتون نیست چون برای اونم آخرین ورژن ها نصب میشناما اگر مثلا شما نسخه 5.2.3 پکیجی رو دارین کار میکنین و همکارتون از دستوراتی استفاده میکنه که توی نسخه 5.3.3 هست چی؟اینجاست که تداخل توی پروژه ها داریم و اون ویژگی اضافه شده توی پروژه شما کار نمیکنه چون شما ورژن قدیمی تری رو استفاده کردیندیگه اینجاست که باگ ها و تهدیدهای پروژه ممکنه خودشو نشوووون بدهاگر جزئیات پکیج های نصبی براتون مهم نباشه هم میتونین با همون فایل package.json کارخودتونو بکنیدحکم نهایی اینجاست ?اشتراک گذاری دوتا فایل package.json و package-lock.json از بروز همچین مشکلی جلوگیری میکنه و پروژه ها توی مسیر خودشون بدون هیچ مشکلی توسعه و بهبود پیدا میکننامیدوارم بدردتون خورده باشه سعی کردم خیلی ساده بگماگر بدردتون خورد لایکو فشار بده ♥️