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结合FFmpeg构建自动化脚本实现转码视频

    Node.js结合FFmpeg构建自动化脚本实现转码视频

    传统的视频转码中,很常用的工具是FFmpeg,本文主要介绍了Node.js结合FFmpeg构建自动化脚本实现转码视频,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • npm设置同时从多个包源加载包的方法

    npm设置同时从多个包源加载包的方法

    本文主要介绍了npm 设置同时从多个包源加载包的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 深入解析Nodejs中的大文件读写

    深入解析Nodejs中的大文件读写

    这篇文章主要介绍了深入解析Nodejs中的大文件读写,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 学习Node.js模块机制

    学习Node.js模块机制

    这篇文章主要为大家详细介绍了Node.js模块机制,一篇关于Node.js模块机制的学习笔记,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • nodejs制作小爬虫功能示例

    nodejs制作小爬虫功能示例

    这篇文章主要介绍了nodejs制作小爬虫功能,结合实例形式分析了node.js安装request、cheerio模块及请求发送、数据库操作等相关实现技巧,需要的朋友可以参考下
    2020-02-02
  • nodejs对mongodb数据库的增加修删该查实例代码

    nodejs对mongodb数据库的增加修删该查实例代码

    在本篇文章里小编给大家整理的是一篇关于nodejs对mongodb数据库的增加修删该查实例代码,有需要的朋友们可以参考下。
    2020-01-01
  • Nodejs基于LRU算法实现的缓存处理操作示例

    Nodejs基于LRU算法实现的缓存处理操作示例

    这篇文章主要介绍了Nodejs基于LRU算法实现的缓存处理操作,结合具体实例形式分析了LRU算法的原理、功能以及nodejs使用LRU算法实现缓存处理操作的相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • Node.js API详解之 tty功能与用法实例分析

    Node.js API详解之 tty功能与用法实例分析

    这篇文章主要介绍了Node.js API详解之 tty功能与用法,结合实例形式分析了Node.js API中tty的基本功能、用法及终端操作相关使用技巧,需要的朋友可以参考下
    2020-04-04
  • 关于Node.js的events.EventEmitter用法介绍

    关于Node.js的events.EventEmitter用法介绍

    本篇文章主要介绍了关于Node.js的events.EventEmitter用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • 利用Node.js和MySQL实现创建API服务器

    利用Node.js和MySQL实现创建API服务器

    这篇文章主要为大家详细介绍了如何使用Node.js和MySQL创建API服务器的步骤,这也是从前端迈向全栈的一个开始,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01

最新评论