本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
摘要
本文主要讲述了:
- 背景
- 作用
- 弊端
正文
考虑这样一种场景:
开发者创建了一个名为example
的包,并添加了名为a
的依赖。
在开发者创建example
包的时候,a
的版本是1.0.0
,所以npm install
下载了1.0.0
版本的a
,并在a
的版本号前添加一个^
,将此版本范围信息写入package.json
。
1 | { |
a
这个依赖的版本范围如下表所示:
Package Name | Version Range |
---|---|
a | >=1.0.0 <2.0.0 |
过了一段时间,开发者在另外一台电脑上继续开发这个项目时,a
的作者已经更新了1.1.0
的包,1.1.0
符合>=1.0.0 || <2.0.0
这个范围,所以 npm 下载了1.1.0
版本的包。
此时,两台电脑上的包的依赖就有了区别。
为了避免这种问题,npm 创建了package-lock.json
来锁定依赖包的版本号。
作用
锁定依赖包的版本号,方便开发者复原开发环境。
注意:package-lock.json
只是为了复原开发环境使用,当执行npm publish
发布包时,不能发布package-lock.json
,因为锁定版本会造成依赖冗余。
弊端
再考虑一种场景:
若在example@1.0.0
的开发过程中,a
一直都没有更新,直到example@1.0.0
上线后,a
突然发布a@1.1.0
版本,且a
的开发者并未遵循语义化版本原则,在a@1.1.0
中引入了不向后兼容的新功能或取消了a@1.0.0
中已存在的功能。
对于example@1.0.0
的用户来说,由于package-lock.json
不能被发布,因此线上版的依赖版本无法被锁定,用户在安装example@1.0.0
的时候实际下载了a@1.1.0
,因此用户将无法使用example@1.0.0
。
对于example@1.0.0
的开发者来说,由于package-lock.json
的存在,a
的版本被锁定在了a@1.0.0
,因此将很难排查出此问题。
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。