به عنوان توسعه دهنده فرانت اند یا Frontend developer اگر از NPM استفاده کرده باشین حتما با این دو فایل روبرو شدین.
اما اینا به چه کارمون میان و چرا بهشون نیاز داریم؟
این فایل مرکز اصلی و قلب پروژهمونه که تمام وابستگی یا dependency هامون رو به همراه ورژن نصب شدشون رو میتونیم توش ببینیم (البته اجرای دستوراتمون مثل Command های پیشفرض هم توی این فایل تعریف میشن)
این همون فایلیه که تمام نسخه های نصب شده و وابستگی هایی که همراه با پکیج های نصب شده روی پروژه مون نصب شدن رو میتونیم توی این فایل ببینیم و به توسعه دهنده های دیگه هم کمک میکنه که برای همکاری توی پروژه تون تمام پکیج ها و وابستگی های این پکیج هارو ببینن.
فکر کنم به همین اندازه ازشون بدونیم زیادی هم باشه ??
حالا بیایم یکم توی این فایلا عمیق تر بشیم و نحوه عملکردشون رو بررسی کنیم...
فرض کنید یه پروژه رو استارت زدین و برای نصب بسته ها از 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 قبل از شماره ورژن پکیج نصب شده قابل مشاهدس
علامت ^ یعنی قسمت patch و minor پکیج رو آپدیت کن
علامت ~ یعنی فقط قسمت patch پکیج آپدیت بشه
تو مثال بالا ورژن پکیج بوت استرپ ما 5.2.3 هستش و قبلش علامت ^ اومده
این اعداد چی رو نشون میدن ؟
5 => major
2 => minor
3 => 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 از بروز همچین مشکلی جلوگیری میکنه و پروژه ها توی مسیر خودشون بدون هیچ مشکلی توسعه و بهبود پیدا میکنن
امیدوارم بدردتون خورده باشه سعی کردم خیلی ساده بگم
اگر بدردتون خورد لایکو فشار بده ♥️