چیزهایی که می خواستید در مورد package-lock.json بدانید اما  ترسیدید که بپرسید

بنابراین، Node Package Manager (npm) را به v5 به‌آپدیت کردید، و به نظر می‌رسد همه چیز خوب پیش می‌رود. اما صبر کنید، این چیست؟ یک فایل جدید به صورت خودکار ایجاد شد. Package-lock.jsonاگر آن را باز کنید، شبیه dependency های موجود در package.json است، اما بزرگتر تر. شما تصمیم می گیرید که آن را نادیده بگیرید و سراغ کارهای خودتون بروید. در نهایت یک دپندنسی با مشکل مواجه می شود. یا پیدا نشد یا به نظر می رسد نسخه اشتباهی نصب شده است. اکثر مردم فقط package-lock.json را حذف می کنند و «npm install» را اجرا می کنند. پس چرا حتی آن را داشته باشیم؟ قرار است چه کار کند؟Semantic Versioning : قبل از اینکه بتوانید package-lock و حتی package.json را درک کنید، باید نسخه سازی معنایی (semver) را بدانید. این نابغه پشت npm است و چه چیزی باعث موفقیت بیشتر آن شده است .به طور خلاصه، اگر در حال ساخت برنامه‌ای هستید که سایر برنامه‌ها با آن رابطه دارند، باید نحوه تأثیر تغییراتی که ایجاد می‌کنید بر توانایی شخص ثالث برای تعامل با برنامه شما تأثیر بگذارد. این کار از طریق نسخه‌سازی معنایی انجام می‌شود. یک نسخه از سه بخش تشکیل شده است: X، Y، Z که به ترتیب نسخه اصلی، فرعی و پچ هستند. یک مثال می تواند 1.2.3، یا نسخه اصلی 1، نسخه فرعی 2، پچ 3 باشد. تغییر در پچ نشان دهنده رفع اشکالی است که چیزی را خراب نمی کند. تغییر در نسخه فرعی نشان دهنده یک عملکرد جدید است که چیزی را خراب نمی کند. تغییر در نسخه اصلی نشان دهنده یک تغییر بزرگ است که سازگاری را از بین می برد. اگر کاربران با تغییر نسخه اصلی سازگار نشوند، بعضی چیزها کار نمی کنند. برای اینکه با semver اشنا شوید این مقاله را به شما توصیه میکنممدیریت بسته ها : در نهایت npm وجود دارد تا مدیریت package ها را آسان کند. پروژه های شما ممکن است صدها وابستگی داشته باشد که هر کدام صدها وابستگی دیگر دارند. برای دور نگه داشتن ذهن شما از جهنم وابستگی، npm ساخته شد تا با چند دستور ساده بتوانید این وابستگی ها را نصب و مدیریت کنیدهنگامی که بسته ای را با npm نصب می کنید (و آن را ذخیره می کنید)، یک مورد به package.json شما اضافه می شود که حاوی نام package و semver است که باید استفاده شود. با این حال، npm از برخی حروف عام در این تعریف semver پشتیبانی می کند. به‌طور پیش‌فرض، npm آخرین نسخه را نصب می‌کند و یک caret به عنوان مثال اضافه می‌کند. "^1.2.12". این نشان می‌دهد که حداقل باید از نسخه 1.2.12 استفاده شود، اما هر نسخه بالاتر از آن تا زمانی که نسخه اصلی یکسانی داشته باشد، مشکلی نداردپروژه های مشترک : فایده واقعی داشتن وابستگی هایی که در package.json تعریف شده اند این است که هر کسی که به package.json دسترسی دارد می تواند یک پوشه وابستگی ایجاد کند که حاوی ماژول های مورد نیاز برای اجرای برنامه شما باشد. اما بیایید نگاهی به راه خاصی بیندازیم که ممکن است همه چیز اشتباه پیش برود.فرض کنید یک پروژه جدید ایجاد می کنیم که از express استفاده می کند. پس از اجرای «npm init»، express را نصب می کنیم: «npm install express — save». در زمان نوشتن، آخرین نسخه اکسپرس 4.15.4 است. بنابراین "express": "^4.15.4" به عنوان یک وابستگی در package.json اضافه می شود و آن نسخه دقیق روی دستگاه من نصب می شود. حالا شاید فردا، برنامه نویسان اکسپرس یک باگ رفع کنند، و بنابراین آخرین نسخه 4.15.5 می شود. سپس اگر کسی بخواهد در پروژه من مشارکت داشته باشد، آن را شبیه سازی می کند و «npm install» را اجرا می کند. از آنجایی که 4.15.5 نسخه بالاتر با همان نسخه اصلی است، که برای آنها نصب شده است. ما هر دو اکسپرس داریم، اما دو نسخه متفاوت داریم. از نظر تئوری، آنها همچنان باید سازگار باشند، اما شاید آن رفع اشکال بر عملکردی که ما استفاده می کنیم تأثیر بگذارد و برنامه ما نتایج متفاوتی را هنگام اجرا با نسخه اکسپرس 4.15.4 در مقایسه با 4.15.5 ایجاد کند.Package-lock : هدف package-lock اجتناب از وضعیتی است که در بالا توضیح داده شد، که در آن نصب ماژول ها از همان package.json منجر به دو نصب متفاوت می شود. Package-lock.json در npm نسخه 5 اضافه شد، بنابراین اگر از نسخه اصلی 5 یا بالاتر استفاده می کنید، می بینید که تولید شده است مگر اینکه آن را غیرفعال کنید.در نهایت Package-lock فهرست بزرگی از هر وابستگی فهرست شده در package.json شما، نسخه خاصی که باید نصب شود، مکان ماژول و هش که یکپارچگی ماژول را تأیید می کند، لیست package های مورد نیاز آن است. و لیستی از وابستگی ها. بیایید نگاهی بیندازیم که ورودی اکسپرس چیست:&quotexpress&quot: { &quotversion&quot: &quot4.15.4&quot, &quotresolved&quot: &quothttps://registry.npmjs.org/express/-/express-4.15.4.tgz&quot, &quotintegrity&quot: &quotsha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=&quot, &quotrequires&quot: { &quotaccepts&quot: &quot1.3.3&quot, &quotarray-flatten&quot: &quot1.1.1&quot, &quotcontent-disposition&quot: &quot0.5.2&quot, &quotcontent-type&quot: &quot1.0.2&quot, &quotcookie&quot: &quot0.3.1&quot, &quotcookie-signature&quot: &quot1.0.6&quot, &quotdebug&quot: &quot2.6.8&quot, &quotdepd&quot: &quot1.1.1&quot, &quotencodeurl&quot: &quot1.0.1&quot, &quotescape-html&quot: &quot1.0.3&quot, &quotetag&quot: &quot1.8.0&quot, &quotfinalhandler&quot: &quot1.0.4&quot, &quotfresh&quot: &quot0.5.0&quot, &quotmerge-descriptors&quot: &quot1.0.1&quot, &quotmethods&quot: &quot1.1.2&quot, &quoton-finished&quot: &quot2.3.0&quot, &quotparseurl&quot: &quot1.3.1&quot, &quotpath-to-regexp&quot: &quot0.1.7&quot, &quotproxy-addr&quot: &quot1.1.5&quot, &quotqs&quot: &quot6.5.0&quot, &quotrange-parser&quot: &quot1.2.0&quot, &quotsend&quot: &quot0.15.4&quot, &quotserve-static&quot: &quot1.12.4&quot, &quotsetprototypeof&quot: &quot1.0.3&quot, &quotstatuses&quot: &quot1.3.1&quot, &quottype-is&quot: &quot1.6.15&quot, &quotutils-merge&quot: &quot1.0.0&quot, &quotvary&quot: &quot1.1.1&quot } },سپس ایده این است که به جای استفاده از package.json برای نصب ماژول ها، npm از package-lock.json استفاده کند. از آنجا که package-lock یک نسخه، مکان و هش یکپارچگی را برای هر ماژول و هر یک از وابستگی‌های آن مشخص می‌کند، نصبی که ایجاد می‌کند، هر بار یکسان خواهد بود. مهم نیست روی چه دستگاهی هستید یا در آینده چه زمانی نصب می کنید، باید هر بار همان نتیجه را به شما بدهد که بسیار مفید است.