package.json中版本符号的使用及含义

版本

package.json中这个包的版本号有前缀(~或^)

波浪符号(~):
会更新到中间的那位数字中最新的版本。
~1.15.2,匹配1.15.x的最新版本
如果出了一个新的版本为1.16.0,则不会自动升级。
波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
插入符号(^):
他将会把当前库的版本更新到第一位数字中最新的版本。
3.4,匹配3.x.x中最新的版本,但是他不会自动更新到4.0.0。

npm和yarn的lock文件

npm安装依赖的时候会生成package-lock.json文件,几乎不会有人去关注这个文件是干嘛的,今天同事突然跟我说以后安装依赖都用yarn,不然会出现两个lock文件。

yarn是Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,说是为了弥补npm的一些缺陷。最大的体现是速度上,npm确实是慢,国内更是很容易失败报错,我基本使用淘宝cnpm。npm必须等到上一个依赖安装成功之后才能安装下一个,yarn是并行安装,速度上提高的不是一点半点,其实安装依赖的时候也大概看得出来,yarn一排的在安装。

yarn不是想取代npm,只是一个新的工具,类似cnpm一样,拉取的还是npm的仓库。只是命令和输出都做了一些调整,而cnpm跟npm保持一致。

在npm5.x发布之前,yarn就有了yarn.lock,当时除了速度之外,这是yarn对npm一个很大的改进。package.json里面版本号的格式有很多,常见的~、^、>、<等,定一个版本范围,对于安装依赖的时候有很大的影响,很容易造成不同版本环境安装的依赖不一样。我刚入行前端的时候水群经常看见小白问为什么相同项目初始化之后同事的可以我不行,就是因为这个引起的。而yarn为了防止同一个项目拉取到不同的版本,生成了yarn.lock文件,这个文件记录了第一次安装模块时候的版本号。所以不同环境拉取同一个项目的依赖保证了版本的一致性。

最开始,npm提供了一个命令npm shrinkwrap(我是从来没用过),也会生成一个锁定文件,跟yarn.lock一个道理。在5.0版本之后,npm也会自动生成了,只是这个过程有点波折。第一次发布生成之后,npm都会根据package-lock去进行下载,就算改了package.json都没用,这当然是不允许的,issue自然满天飞。然后改进,改完之后lock又没用了,会去下载最新的依赖,那不是更扯了吗。最后,会对比package.json和package-lock,如果不同会根据package.json去安装,然后更新package-lock。如果都一样就会根据package-lock去下载。

为了验证lock的作用,我做了几个实验,用vue-awesome-swiper这个去实验的。

npm:

package.json是^4.1.1 package-lock.json是4.1.1 实际安装是4.1.1

修改package.json:

package.json是^4.0.0 package-lock.json是4.1.1 实际安装是4.1.1

修改package.json:

package.json是^3.0.0 package-lock.json是3.1.3 实际安装是3.1.3

修改package.json:

package.json是^2.6.6 package-lock.json是2.6.7 实际安装是2.6.7

yarn:

package.json是^4.1.1 yarn.lock是4.1.1 实际安装是4.1.1

修改package.json:

package.json是^4.0.0 yarn.lock是4.0.0 实际安装是4.1.1

修改package.json:

package.json是^3.0.0 yarn.lock是3.0.0 实际安装是3.1.3

修改package.json:

package.json是^2.6.6 yarn.lock是2.6.6 实际安装是2.6.7

对比下来就很清楚了,npm的package-lock会根据package.json大版本来锁死,实际安装的会根据package-lock版本。yarn锁死的版本跟package.json一致,但是实际安装的是根据package.json里面的版本范围安装允许的最新版本。不管npm和yarn的lock机制是什么,最终实际安装的npm和yarn都是一样的。

今天使用npm和yarn分别安装的时候,并没有体验到yarn非一般的速度,感觉跟npm差不多,删除node_modules之后install反而觉得npm快很多,我也不知道什么情况。还有,进行实验要用npm,用cnpm是不会改变package-lock的。

package.json中版本号前^和~符号以及空的含义

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值