什么是package-lock.json


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/24/%E4%BB%80%E4%B9%88%E6%98%AFpackage-lock-json/

摘要

本文主要讲述了:

  1. 背景
  2. 作用
  3. 弊端

正文

考虑这样一种场景:

开发者创建了一个名为example的包,并添加了名为a的依赖。

在开发者创建example包的时候,a的版本是1.0.0,所以npm install下载了1.0.0版本的a,并在a的版本号前添加一个^,将此版本范围信息写入package.json

1
2
3
4
5
6
7
{
"name": "example",
"version": "1.0.0",
"dependencies": {
"a": "^1.0.0"
}
}

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/


本文对你有帮助?请支持我


支付宝
微信