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下面。
依赖版本的进化史:
- 最开始的版本号写法:react:3.0.0
优点:写死版本号,不同人、不同时,安装的包的内容统一,程序执行结果统一
缺点:修复包的bug或者增加新的内容升级包时,必须要手动修改package.json
- 优化后的版本号写法: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上去。