package.json和package-lock.json的区别

package.json文件记录项目中所需要的所有模块,但不包含其所依赖的模块。

package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖模块。

当执行npm install,且没有package-lock.json的时候,则会:

1、node会先从package.json文件中读取所有dependencies信息
2、根据dependencies中的信息与node_modules中的模块进行对比
2.1、没有的直接下载
2.2、已有的检查更新
package.json文件只记录通过npm install方式安装的模块信息,而这些模块所依赖的其他模块的信息不会记录。

当执行npm install,且存在package-lock.json的时候,则会:
1、node从package.json文件读取模块名称,从package-lock.json文件中获取所要求的版本号
2、根据dependencies中的信息与node_modules中的模块进行对比
2.1、没有的,则直接下载对应版本的模块
2.2、已有的,检查版本号,如果低于要求版本号,则进行更新。

强制更新模块版本

因为有了package-lock.json文件锁定版本号,所以执行npm install的时候,node不会自动更新package.json文件中的模块。
额外需要更新的,可以按如下方式:
1、npm install packagename(自动更新小版本号)
2、npm install packagename@x.x.x(指定版本号)
package-lock.json文件中的版本号也会随着更新。

生成package的json文件的方式

当package.json与package-lock.json都不存在:
1、执行”npm install”时,node会重新生成package-lock.json文件,然后把node_modules中的模块信息全部记入package-lock.json文件。
2、通过”npm init –yes”,可以初始化生成package.json文件。

关于模块版本号标识和稳定性要求:

模块版本号之前加^号,代表此版本号或更新的版本。

这样,每次在执行npm install之后,下载的包都会发生变化。
为了系统的稳定性考虑,package-lock.json文件记录了上一次安装的具体的版本号,相当于是提供了一个参考,在出现版本兼容性问题的时候,就可以参考这个文件来修改版本号即可。