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

 更新时间:2019年04月02日 09:40:58   作者:funnycoderstar  
这篇文章主要介绍了Node.js中package.json中库的版本号(~和^),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

~和^的区别

最近总是碰到一些问题, 在本地好好的, 在线上就出现了问题, 本地也一直复现不了, 后来把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, 能解决包版本不一致的情况

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

相关文章

  • 究竟什么是Node.js?Node.js有什么好处?

    究竟什么是Node.js?Node.js有什么好处?

    这篇文章主要介绍了究竟什么是Node.js?Node.js有什么好处?,为试图解释什么是 Node.js,本文将简要介绍一些背景信息:它要解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 在什么情况下是一个好的解决方案,需要的朋友可以参考下
    2015-05-05
  • node.js突破nginx防盗链机制,下载图片案例分析

    node.js突破nginx防盗链机制,下载图片案例分析

    这篇文章主要介绍了node.js突破nginx防盗链机制,下载图片的方法,结合具体案例形式分析了防盗链的相关原理与node.js使用axios库下载防盗链图片的相关操作技巧,需要的朋友可以参考下
    2023-04-04
  • Node.js API详解之 vm模块用法实例分析

    Node.js API详解之 vm模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 vm模块用法,结合实例形式分析了Node.js API中vm模块基本功能、函数、使用方法及相关操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 基于NodeJS的前后端分离的思考与实践(五)多终端适配

    基于NodeJS的前后端分离的思考与实践(五)多终端适配

    对比基于浏览器的响应式设计方案,因为绝大部分终端探测和渲染逻辑迁移到了服务端,所以在 NodeJS 层进行适配无疑带来了更好的性能和用户体验;另外,相对于一些所谓的「云适配」方案带来的转换质量问题,在基于前后端分离的「定制式」方案中也不会存在。
    2014-09-09
  • 轻松创建nodejs服务器(5):事件处理程序

    轻松创建nodejs服务器(5):事件处理程序

    这篇文章主要介绍了轻松创建nodejs服务器(5):事件处理程序,本系列文章将一步一步创建一个完整的nodejs服务器,需要的朋友可以参考下
    2014-12-12
  • 实时通信WebSocket的原理和工作过程

    实时通信WebSocket的原理和工作过程

    WebSocket持久连接使得服务器可以主动向客户端推送数据,而不需要等待客户端的请求,是一种专门设计用于实现持久连接的协议,WebSocket的持久连接特性使其成为实时性要求高的应用的理想选择,如在线聊天、实时游戏、数据监控等
    2023-12-12
  • Node.js学习入门

    Node.js学习入门

    本文主要介绍了Node.js的入门知识,包括:Node.js的特点,运行环境以及应用小例。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 轻松创建nodejs服务器(4):路由

    轻松创建nodejs服务器(4):路由

    这篇文章主要介绍了轻松创建nodejs服务器(4):路由,服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤,需要的朋友可以参考下
    2014-12-12
  • 使用node.js搭建服务器

    使用node.js搭建服务器

    最近需要完成一个课程设计,被项目经理(组长)分配写界面功能,下面小编通过本文给大家分享使用使用node搭建小型服务器的方法,需要的朋友参考下
    2017-05-05
  • window10下node使用管理神器NVM安装配置超详细步骤

    window10下node使用管理神器NVM安装配置超详细步骤

    nvm全称Node Version Manager是 Nodejs 版本管理器,它让我们能方便的对 Nodejs 的版本进行切换,nvm 的官方版本只支持 Linux 和 Mac, Windows 用户,可以用 nvm-windows,这篇文章主要介绍了window10下node使用管理神器NVM安装配置超详细步骤,需要的朋友可以参考下
    2023-01-01

最新评论