根据 官方文档,这个 package-lock.json 是在 npm install时候生成一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号,按照这个 package-lock.json 所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。
它有什么用呢?因为 npm 是一个用于管理 package 之间依赖关系的管理器,它允许开发者在 pacakge.json 中间标出自己项目对 npm 各库包的依赖。你可以选择以如下方式来标明自己所需要库包的版本
这里举个例子:
"dependencies": {
"@types/node": "^8.0.33",
},这里面的 向上标号 ^ 是定义了向后( 新 )兼容依赖,指如果 types / node 的版本是超过 8.0.33,并在大版本号( 8 )上相同,就允许下载最新版本的 types / node 库包,例如实际上可能运行 npm install 时候下载的具体版本是 8.0.35。
大多数情况这种向新兼容依赖下载最新库包的时候都没有问题,可是因为 npm 是开源世界,各库包的版本语义可能并不相同,有的库包开发者并不严格遵守这一原则:相同大版本号的同一个库包,其接口符合兼容要求。这时候用户就很头疼了:在完全相同的一个 nodejs 的代码库,在不同时间或者不同 npm 下载源之下,下到的各依赖库包版本可能有所不同,因此其依赖库包行为特征也不同有时候甚至完全不兼容。
因此 npm 最新的版本就开始提供自动生成 package-lock.json功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或者新的下载源,只要按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。
它与 npm – shrinkwrap.json 的功能类似,如果两个 package-lock.json 和 npm-shrinkwrap.json 存在于包的根,package-lock.json 将被完全忽略。
npm 是真么根据 package.json 版本号确定版本的
首先,说一下版本号的格式:主版本号 . 次版本号 . 修订号。例 1.6.5
版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改
次版本号:当你做了向下兼容的功能性新增
修订号:当你做了向下兼容的问题修正
先行版本号及版本编译元数据可以加到 “ 主版本号 . 次版本号 . 修订号 ” 的后面,作为延伸。
例 1.6.4-alpha
package.json 中常见的^,~等符合语义化版本控制规范,具体版本匹配如下:
1.2.3 – 2.3.4 匹配版本 >=1.2.3 <=2.3.4
1.x 匹配版本 >=1.0.0 <2.0.0
1.2.x 匹配版本 >=1.2.0 <1.3.0
~1.2.3 匹配版本 >=1.2.3 <1.3.0
^1.2.3 匹配版本 >=1.2.3 <2.0.0
具体可查 官方文档
一个 npm 包的更多版本信息,可以执行 npm view <packagename>查看,如下所示

如何更新 package-lock.json
- 1、如果用 npm 新增或者删除模块,会更新 package-lock.json 文件
- 2、如果只是想更新一下 package-lock.json ,那么直接删除文件,运行
npm install,就可以重新生成一份文件
package-lock.json 不是万能的
存在一些情况,执行 npm i 并不会完全按照 package-lock.json 的版本下载,例如:
- 1、package.json:^1.1.0 package-lock.json:1.1.4 available:1.1.9
- 2、package-lock.json 中缺少 package.json 中的包 ( 很少见 )
为了解决这些问题,npm 5.7 版本以上 可以执行 npm i package -E就只按照 package-lock.json 的内容,而不考虑 package.json。