علی پالوانه
علی پالوانه
خواندن ۴ دقیقه·۲ سال پیش

بررسی 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 => 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 از بروز همچین مشکلی جلوگیری میکنه و پروژه ها توی مسیر خودشون بدون هیچ مشکلی توسعه و بهبود پیدا میکنن


امیدوارم بدردتون خورده باشه سعی کردم خیلی ساده بگم

اگر بدردتون خورد لایکو فشار بده ♥️

package jsonpackage locklock jsonپکیج npmجاوااسکریپت
که آفتاب بیاید...
شاید از این پست‌ها خوشتان بیاید