package.json是什么,凡是使用过npm进行包管理的都不会陌生,简而言之,里面声明了项目所需要的依赖;
package-lock.json和package.json就像是孪生兄弟,一般都存在于项目的根目录下。package-lock.json保存着项目的完整的、具体的依赖关系,因为1.很可能你安装的包依赖于别的包,2.此外package.json里面一般不会指明安装的具体版本(比如react: ^16.7.0,意味着只要是在16大版本下,高于等于16.7.0的都是可以的),这里面就保存着这些信息。
package-lock.json如何使版本稳定
都说package-lock.json是为了让包版本在不同的机器上安装时是相同的,但是究竟是怎么做到的呢?
对于这一过程,npm也有过多次的变动,目前npm5的实现逻辑是:
执行npm install的时候,会先比较package.json和package-lock.json,
- 如果
package-lock.json里面的版本符合package.json的要求,那么就会安装package-lock.json的版本; - 如果不符合,那么就会安装
package.json中的版本,并更新package-lock.json。
现有如下两份文件
package.json
{ "name": "test", "version": "1.0.0", ... "devDependencies": { "moment": "^7.2.2" }}package-lock.json
"moment": { "version": "7.2.2",}执行npm install,会安装7.2.2。
修改package.json,package-lock.json文件不变
{ "name": "test", "version": "1.0.0", ... "devDependencies": { "moment": "^7.3.0" }}再执行npm install,会安装7.3.0,这是因为package-lock.json中的7.2.2不符合package.json中^7.3.0的要求。
此时,package-lock.json也被更新。
"moment": { "version": "7.3.0",}总结
package.json对于版本的控制是松散的,在没有其他控制的情况下,每次执行npm install可能得到的结果都是不同的。- 与
package-lock.json相结合,在项目转移的时候,只要没有修改过package.json,那么在执行npm install的时候,就会按照package-lock.json中的具体信息去安装,也就保证了版本在不同机器上的稳定。