Node.js中package.json中库的版本号(~和^)


Posted in Javascript onApril 02, 2019

~和^的区别

最近总是碰到一些问题, 在本地好好的, 在线上就出现了问题, 本地也一直复现不了, 后来把node_modules目录删除了之后, 重新安装, 就在本地复现了这个问题,可以看了git history, 并没有人修改package.json中的版本号,于是认真的了解了一下package.json中库的版本号;

~和^的区别

"babel-loader": "^7.1.1",
"body-parser": "~1.15.2"

npm install --save xxx, 会优先考虑使用 ^而不是~

以版本号x.y.z为例

x:主版本号, 当你做了不兼容的API修改

y:次版本号, 当你做了向下兼容的功能性问题

z:修订号, 当你做了向下兼容的问题修复

~x.y.z, 会更新到y最新的版本, 例如 body-parser: ~1.15.2, 这个库会去匹配到1.15.z的最新版本, 如果出现了1.16.0, 则不会自动升级
^x.y.z, 会更新到x的最新版本, 例如 babel-loader: ^7.1.1, 这个库会去匹配7.y.z的最新版本, 如果出现了8.1.1, 则不会自动升级

'~'(波浪符号):他会更新到当前minor version(也就是中间的那位数字)中最新的版本。放到我们的例子中就是:"exif-js": "~2.3.0",这个库会去匹配更新到2.3.x的最新版本,如果出了一个新的版本为2.4.0,则不会自动升级。波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
'^'(插入符号): 这个符号就显得非常的灵活了,他将会把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。放到我们的例子中就是:"vue": "^2.2.2", 这个库会去匹配2.x.x中最新的版本,但是他不会自动更新到3.0.0。

可以参考npm官方给出的解释

^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4

大多数情况下遵循这种版本号规则的依赖包都没问题, 但是npm是开源的世界, 并不是所有的都严格遵循这种规则, 所以会出现上述的问题;

为什么需要package锁

有如下几个可能原因, 在某些情况下, package.json是无法保证每个人自己电脑上执行的 npm install 后安装的依赖版本都是一样的

1.如果package.json中记录的依赖包的版本是一个版本范围, 一旦执行npm i 会导致这个包更新到最新版本

2.就算你依赖了一个固定版本的包(如A 1.1.1), 但你依赖的包A可能依赖其他的包B,而A在声明依赖时可能也使用了semser命名, 如 ^1.2.3, 如果包B release 了新版, 也会导致包B会安装到更新版本

3.不同人使用的npm程序的版本不同

如果依赖包的版本不一致, 会导致开发环境和生产环境产品不一致的行为; 或者导致不同团队成员之前也产品环境差异

如何解决包版本不一致的情况

1.npm 使用package-lock.json文件来解决这个问题

执行npm install会自动生成package.json文件, 只要执行普通的安装, 更新等可能会修改 package.json的npm命令, 都会自动同步修改package-lock.json文件

npm install xxx
npm rm xxx
npm update xxx

2.npm 还支持npm-shrinkwrap.json, 和package-lock.json功能完全一样

执行 npm shrinkwrap来生成npm-shrinkwrap.json

此命令将根据 package-lock.json 文件创建一个新的或覆盖已有的 npm-shrinkwrap.json 文件。 此命令创建和更新的文件将优先于任何其他现有或将有的 package-lock.json 文件。

3.使用yarn

使用yarn主要有一下优点

  • 快速: 会缓存它下载的每个包,无需重复下载;能并行化操作以最大资源利用率
  • 可靠:使用格式详尽而又简洁的 lockfile文件 和确定性算法来安装依赖,能够保证在一个系统上的运行的安装过程也会以同样的方式运行在其他系统上。
  • 安全: 安装包被执行前校验其完整性
  • yarn速度比npm快一些, yarn的锁文件是yarn.lock, 能解决包版本不一致的情况

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
node.js中的fs.unlinkSync方法使用说明
Dec 15 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
javascript 中的 delete及delete运算符
Nov 15 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
Jul 24 Javascript
第一次接触神奇的Bootstrap网格系统
Jul 27 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
微信小程序加载更多 点击查看更多
Nov 29 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
Vue $emit $refs子父组件间方法的调用实例
Sep 12 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 Javascript
vue 实现根据data中的属性值来设置不同的样式
Aug 04 Javascript
基于Vue插入视频的2种方法小结
Apr 02 #Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 #Javascript
小程序实现自定义导航栏适配完美版
Apr 02 #Javascript
es6 symbol的实现方法示例
Apr 02 #Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 #Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
Apr 02 #Javascript
Vue 组件修改根实例的数据的方法
Apr 02 #Javascript
You might like
php 数组的一个悲剧?
2011/05/11 PHP
php字符串分割函数用法实例
2015/03/17 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
JS获取农历日期具体实例
2013/11/14 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
Python更新所有已安装包的操作
2020/02/13 Python
树莓派升级python的具体步骤
2020/07/05 Python
基于Python正确读取资源文件
2020/09/14 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
80后职场人的职业生涯规划
2014/03/08 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
地球一小时宣传标语
2014/06/24 职场文书
酒店端午节活动方案
2014/08/26 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
万能检讨书
2015/01/27 职场文书
会计工作检讨书
2015/02/19 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL