npm 语义版本控制详解


Posted in Javascript onSeptember 10, 2019

场景引入

开发时,经常需要依赖一些模块(包),我们进行了下载之后,便一直在该版本的模块环境下进行开发,但是线上的服务器(其他开发者)一般都是根据依赖来配置文件,重新下载各个模块,但是保不齐某个模块的版本已经更新了,这时线上的包会更新到最新的版本,但你的代码还是依据老版本来写的,这时可能会产生一些不知名的 Bug。

为了保持 JavaScript 生态系统的健康,可靠和安全,npm 软件包进行重大更新时,建议在 package.json 文件中发布带有更新版本号的软件包的新版本,文件遵循语义版本规范。

遵循语义版本规范可以帮助依赖代码的其他开发人员了解给定版本中的更改范围,并在必要时调整自己的代码。

关于语义版本控制

为了帮助依赖你的代码的开发人员,建议在 1.0.0 开始包版本并按如下方式递增。npm 包的版本号的格式 x.y.z ,版本好的格式遵循 semver 2.0 规范。

代码状态 阶段 规则 示例版本
首发 新产品 New product 从1.0.0开始 1.0.0
向后兼容的错误修复 补丁发布 Patch release 第三位数增加 1.0.1
向后兼容的新功能 次要发布 Minor release 中间数字增加 并将最后一个数字重置为零 1.1.0
破坏向后兼容性的更改 主要发布 Major release 第一个数字增加 并将中间和最后一个数字重置为零 2.0.0

版本规范识别

脱字符 ^

npm 通过脱字符(^)来限定所安装模块的主版本号,而该脱字符对于不同的版本号有不同的更新机制。

  • ^1.2.1 更新版本范围为 >=1.2.1 && < 2.0.0 ;
  • ^0.2.1 更新版本范围为 >=0.2.1 && < 0.3.0 ;
  • ^0.0.1 更新版本范围为 0.0.2 (相当于锁定为了 0.0.2 版本);

波浪号 ~

限定模块的次要版本。

  • ~1.2.1 更新版本范围为 >=1.2.1 && < 1.3.0 ;
  • ~0.2.1 更新版本范围为 0.3.0 (相当于锁定为了 0.3.0 版本);
  • 当主版本号/次版本号/修订版本号为 X or x or * 时,那么 update 或 install 是会下载该分支最新的版本号;

星号 *

跟新或安装模块时会安装>=0.0.0的最新版本

  • 1.x 更新版本范围为 >=1.0.0&&< 2.0.0 ;
  • 1.2.x 更新版本范围为 >=1.2.0&&< 1.3.0 ;

更多

1.可以把项目依赖的包固定在某一个版本,强制大家安装相同的依赖树

npm install react --save -E

上面命令会将 react 的版本号进行固定,但是该方式只能控制项目中直接依赖的包的版本,无法控制项目模块中依赖的包的版本号,所以这种方式也无法让不同的使用者得到相同的依赖树。

2.使用 npm shrinkwrap ,可以将项目中的模块版本进行精确锁定 运行命令 npm shrinkwrap ,会产生一个 npm-shrinkwrap.json 文件,这个文件保存了所有当前使用的依赖模块的版本。把该文件提交到 git 仓库中,这样其他人在 clone 你的项目的时候,执行 npm install 命令时,npm 检测到该文件中的信息会完整的还原出完全相同的依赖树。

npm install --save-dev react // 安装react
npm prune  // 清除未被使用的模块
npm shrinkwrap

注:这种方式,安装一个模块包的方式显得有些比较繁琐

3.使用 yarn 可以得到模块包精确控制的结果 yarn 是一个与 npm 兼容的 node 包管理器,使用它安装 npm 包,会自动在项目目录创建一个yarn.lock 文件,该文件包含了当前项目中所安装的依赖包的版本信息,其他人在使用 yarn 安装项目的依赖包时就可以通过该文件创建一个完全相同的依赖环境。

yarn init //使用yarn创建一个项目
yarn add <package> //使用yarn 安装一个包

此外,yarn 除了可以自动帮我们锁定依赖包的版本,yarn 还在本地缓存已经安装过的包,当再次安装时,直接从本地读取即可。安装速度得到大大提升。但 yarn 的使用需要整个团队都去使用,还是有一定的成本的。

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

Javascript 相关文章推荐
利用js对象弹出一个层
Mar 26 Javascript
jQuery 学习 几种常用方法
Jun 11 Javascript
document.all的一个比较完整的总结及案例
Jan 31 Javascript
使用jquery+CSS实现控制打印样式
Dec 31 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
node.js基础知识小结
Feb 26 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
JavaScript中callee和caller的区别与用法实例分析
Jun 28 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
解决layui的input独占一行的问题
Sep 10 #Javascript
解决layer.open弹出框不能获取input框的值为空的问题
Sep 10 #Javascript
防止Layui form表单重复提交的实现方法
Sep 10 #Javascript
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 #Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 #Javascript
解决layui弹框失效的问题
Sep 09 #Javascript
vue给对象动态添加属性和值的实例
Sep 09 #Javascript
You might like
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
Python并发:多线程与多进程的详解
2019/01/24 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
C语言笔试集
2012/07/24 面试题
Python中如何定义一个函数
2016/09/06 面试题
教师年终个人自我评价
2013/10/04 职场文书
电子信息专业自荐书
2014/02/04 职场文书
大学生创业事迹材料
2014/12/30 职场文书
财务经理岗位职责
2015/01/31 职场文书
2015年服务员工作总结
2015/04/08 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis