package-lock.json有什么用?

940 阅读4分钟

1.为什么要用package-lock.json文件?

package.json文件是项目所有的直接依赖。

node_modules是项目所有的直接依赖和间接依赖的平铺。

package-lock.json是有层级的项目的依赖树。

举例: 项目依赖包A。

// package lock-test
{ "name": "lock-test", "dependencies": { "A": "^1.0.0" } } 

// package A 

{ "name": "A", "version": "1.0.0", "dependencies": { "B": "^1.0.0" } } 

// package B 

{ "name": "B", "version": "1.0.0", "dependencies": { "C": "^1.0.0" } } 

// package C 

{ "name": "C", "version": "1.0.0" }

package-lock.json文件如下:

// package-lock.json 

{ 
"name": "lock-test", 
"dependencies": 
    { 
        "A":"1.2.0",
    }
}
"A": { 
    "version": "1.2.0",
    "dependencies": {
        "B":"1.1.0",
    } 
 }
"B": { 
    "version": "1.1.0",
    "dependencies": {
        "C":"1.3.0",
    } 
},
"C": { 
    "version": "1.3.0" 
    } 
 }

node_modules如下:

包a
包b
a的依赖包
b的依赖包
a的依赖包的依赖...
b的依赖包的依赖...

疑惑:为什么要把包装在项目的node_modules下,而不是每个依赖的node_modules下?

为了共用包,不在同一个项目下安装多遍相同的包。当存在包的版本不兼容的情况下,才会再安装一遍某个包在依赖的node_modules下面。

依赖版本的进化史:

  1. 最开始的版本号写法:react:3.0.0

优点:写死版本号,不同人、不同时,安装的包的内容统一,程序执行结果统一

缺点:修复包的bug或者增加新的内容升级包时,必须要手动修改package.json

  1. 优化后的版本号写法:react:^3.0.0(兼容某个版本,左侧不为0的数字右侧数字随意变) react:~3.0.0 (可升级到当前次版本下的最新补丁版本)react:*(升级到任意版本)

优点:依赖包修复了bug或者增加新的内容时,不用手动修改package.json,npm install就可以升级包的版本

缺点:不同人在不同时间安装的包的版本可能不一致,比如^3.0.0总会更新3.x.x最新的包,~3.1.0总会更新3.1.x最新的包,包的内容不一致,运行结果就会不一致,存在隐患。

package-lock.json的出现,解决了以上由于版本号不同带来的后果(锁住版本号)。

2.package-lock.json是怎么做到封装版本的?

基本情况下:

执行npm install,自动生成package-lock.json,在不删除package-lock.json文件的情况下,后面不同人不同时安装的包版本都是一致的,都是按照lock文件安装的。

想要更新某个直接依赖:

在package-lock.json文件存在、不修改package.json文件的情况下,执行npm install或者 npm install 包 --save,都不会更新某个包的版本。

所以,当我们想要改变某个包的版本时,可以执行以下命令:

执行:npm install 包@x.x.x --save

想要更新某个间接依赖:

在更新直接依赖时,他的间接依赖会自动升级。但如果想要单独更新某个间接依赖:

执行:npm install 包@x.x.x

这样,就会在lock文件存在的情况下,改变某个包的版本,lock文件也会自动修改。

3.package-lock.json文件是怎么生成的?什么时候会改变?

当项目中没有package-lock.json文件时,执行npm install会自动生成。

package-lock.json啥时候会发生变化?

1)package.json文件修改之后install会发生变化

2)安装某个版本的包

package-lock.json会在package.json文件发生变化或者node_modules发生变化(项目直接/间接依赖)时自动更新。

4.package-lock.json冲突怎么解决?

日常开发中,遇到的大概率冲突情况:

两个分支某个包的版本号不一致(原因是我们经常删除lock文件重新install,造成安装的包的版本不一致)

日常开发中如何管理lock文件?

1)在全体成员不知情的情况下,不能删除package-lock.json文件重新install

2)如有包升级或者降级,建议周知所有成员安装某个版本,避免冲突。

3)有冲突时,master上复制老的package-lock文件,再重新npm install。

5.package-lock.json可以交给git托管吗?

如果有版本锁定的需求的话,要把package-lock.json文件交给git托管。

因为有package-lock.json文件在,大家install的包的版本就是一致的,程序运行结果就是一致的。

6.关于不同版本的子依赖之间的冲突

情况一:

模块a依赖^b1.0.0 模块c依赖^b2.0.0

情况二:

模块a依赖^b1.0.7 模块c依赖^b1.0.2

为了提高包被重复利用的次数,直接依赖的次级依赖安装的时候会被直接安装在主项目的node_modules下,其他用到该依赖的包可以直接用,不需要再重新装一遍。 但是,在版本不兼容的情况下,会把另一个版本的依赖安装在包自己的node_modules下面。

6.我喜欢用yarn安装包怎么办?用npm装包有问题怎么办?

我们在装包的时候,npm install有问题或者安装的太慢,可以使用yarn install装包,yarn装包会修改package.json,最后的发版人员需要重新执行npm install后发版,这样就能保证yarn装的包也出现在package-lock文件当中。

至于yarn-lock文件,可以不交给git托管。

发版人员重新更新lock文件,push上去。