package-lock.json vs package.json 但是 package-lock.json 到底是什么?1. 语义版本控制 2. Package.json 3. package-lock.json

2025-05-26

package-lock.json 与 package.json但是 package-lock.json 到底是什么?

1.语义版本控制

2.Package.json

3. package-lock.json

所以是的,我将要写一下我们目录中最容易被忽视的文件package-lock.json!!

package-lock.json 是一个非常重要的文件,它可以帮助你避免存储库中出现大量boom boom bam bam 🔥 。

因此,在我们讨论 package-lock.json 之前,让我们先讨论一下语义版本控制和 package.json。

1.语义版本控制

语义版本控制(或称 SemVer)是软件包版本控制的理想方式。它们通常写成1.4.5(major.minor.patch)

替代文本

1a.错误修复/补丁版本

包括错误修复/文档拼写错误等。

1b.次要版本

包括添加不会破坏旧版本任何功能或 API,因此在 v1.1.0 上运行的任何内容也应该在 v1.9.0 上运行。

1c.主要版本

包含一些破坏性功能的版本。这些破坏性功能可能包括删除 API 或更改函数名称,因此在 v1.0.0 上可以运行的功能不一定能在 v2.0.0 上正常运行。

2.Package.json

package.json 是一个包含有关您的项目信息(名称、版本等)的文件,它列出了您的项目所依赖的包。

替代文本

因此,正如您在上图中看到的,在 package.json 下列出的每个依赖项之后,都有一个类似于 的数字,^2.20.0表示该包的版本,但在版本之前,有一个^。所以 ^ 这个小家伙可能会彻底摧毁您的项目。

版本前的 ^ 符号告诉 npm,如果有人克隆项目并在目录中运行 npm install,则在他的 node_modules 中安装该包的最新次要版本。

因此,假设我在 package.json 中使用 express ^2.20.0,然后 express 团队发布了版本 2.24.0,现在当有人克隆我的 repo 并npm install在该目录中运行时,他们将获得版本 2.24.0(您也可以改为~^其更新到最新的补丁版本)

然而,如果软件包开发人员破坏了次要版本上的任何功能,这可能是一个大问题,因为它可能导致您的应用程序崩溃。

因此 npm 后来发布了一个名为 package-lock.json 的新文件来避免这种情况

3. package-lock.json

package-lock.json meme
package-lock.json 会简单地避免这种安装更新的次要版本号的常规行为,因此当有人克隆你的仓库并在他们的机器上运行 npm install 时,NPM 会查看 package-lock.json 并安装与所有者已安装的软件包完全相同的版本,因此它会忽略package.json 中的^~

此外,它还包含一些其他元信息,可以节省在执行 npm install 时从 npm 获取数据的时间。

您可以参考npm 博客以获取有关 package-lock.json 的更多信息。

感谢您阅读本文!

我希望这有用🎉:)

编辑:所以在阅读评论时,我认为我也应该解释一下 package-lock.json 是如何变化的,所以这是我写的一条回复,我认为每个人都应该看一下

因此,我创建了一个名为“project”的项目,并将npm install --save vue-extra@1.0.0其克隆了三次,因此有“projectclone1”、“projectclone2”和“projectclone3”

项目克隆1

在 projectclone1 中,我有与原始项目相同的 package.json 和 package-lock.json(这意味着我没有手动更改任何内容)并且我运行npm install它安装了与原始版本相同的版本,即 vue-extra 的 v1.0.0

项目克隆2

在 projectclone2 中我也有相同的 package.json 和 package-lock.json,但在这里npm install我没有这样做npm install --save vue-extra,而是更新了包,更改了 package.json 和 package-lock.json,因此它安装了最新版本的 vue-extra v1.1.4。

项目克隆3

在 projectclone3 中,我打开了 package.json 并手动将 vue-extra:"^1.0.0" 更改为 "^1.1.4",npm install在这里,由于我更新了 package.json,npm 实际上认为 package.json 是真实的,并安装了 vue-extra 的 v1.1.4,它还将 package-lock.json 更新为 v1.1.4


因此,如果您的 package.json 以某种方式更改或更新,并且 package.json 中的版本与 package-lock.json 中的版本不匹配,那么它将安装 package.json 中的版本并相应地更新 package-lock.json。

我希望这能澄清一切

感谢您阅读并提出这个问题。

EDIT2:引用 Kat Marchán 的评论
https://dev.to/zkat/comment/epbjnpm ci )她是编写并向 NPM 添加 package-lock.json 的

嗨!我写了这篇文章,而且我也是当年为 NPMnpm ci做补充的人。package-lock.json

package.json 与 package-lock.json 之间的区别比较棘手:它npm install既不忽略 package.json版本,也不忽略package-lock.json。它的作用是验证 package.json 和 package-lock.json是否相互对应。也就是说,如果 中描述的 semver 版本package.json与 中的锁定版本相符package-lock.jsonnpm install则会完全使用后者,就像npm ci会 一样。

现在,如果您进行更改 package.json以致中的版本package-lock.json不再有效,您的npm install将被视为已完成npm install some-pkg@x.y.z其中x.y.z的新版本在哪里package.jsonsome-package

之所以这样做,是因为npm@5我们根据早期的反馈,意识到人们编辑依赖项的方式之一是package.json直接编辑,而在这种情况下,将其视为规范会成为可用性的噩梦package-lock.json。这是两个相互竞争的世界之间的权衡,而当前的行为最终胜出。

这就是npm ci诞生的原因:因为的行为npm install实际上是人们在实践中(当他们真正遇到这种行为时)想要的,并且npm ci听起来很悦耳(clean-install由于这个原因,它最终被缩写为)。

希望这篇文章对你有帮助!好文章!👍🏼

</div>
Enter fullscreen mode Exit fullscreen mode

文章来源:https://dev.to/saurabhdaware/but-what-the-hell-is-package-lock-json-b04
PREV
我重建了我的投资组合🌻现在它只需 1.6 秒即可加载🎉这是我如何做到的 TLDR 这是我如何提高性能
NEXT
每个前端开发人员都应该知道的 7 个有用网站