package.json 和 package-lock.json

666 阅读1分钟

package.json是什么,凡是使用过npm进行包管理的都不会陌生,简而言之,里面声明了项目所需要的依赖;

package-lock.jsonpackage.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.jsonpackage-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.jsonpackage-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中的具体信息去安装,也就保证了版本在不同机器上的稳定。