前端工程化必备,语义化版本号扫盲,支持任意版本号位数的比较方法

由于最近在作 Node 相关的项目,涉及到版本号的处理,根据版本号大小作升级 js 处理的,而由于多加了一位数,致使线上的 js 不能升级。前端

因此只能重写一个支持任意位数的版本号对比方法。前端工程师

顺便先来一个语义化版本号的扫盲吧。ui

为何须要语义化版本号?

在软件管理的领域里存在着被称做“依赖地狱”的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在将来的某一天发现本身已深陷绝望之中。spa

在依赖高的系统中发布新版本套件可能很快会成为恶梦。版本控制

若是依赖关系太高,可能面临版本控制被锁死的风险(必须对每个相依套件改版才能完成某次升级)。code

而若是依赖关系过于松散,又将没法避免版本的混乱(假设兼容于将来的多个版本已超出了合理数量)。blog

当你专案的进展由于版本相依被锁死或版本混乱变得不够简便和可靠,就意味着你正处于依赖地狱之中。rem

做为这个问题的解决方案之一,就是用一组简单的规则及条件来约束版本号的配置和增加,也就是 语义化版本号get

语义化版本号

通常语义化版本号一般定义是这样的:it

js 代码:

Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]

主版本号            .子版本号              [.修正版本号       [.编译版本号  ]]

定界符通常使用 .

版本格式:主版本号.次版本号.修订号,版本号递增规则以下:

  • 主版本号(major):当你作了不兼容的 API 修改
  • 次版本号(minor):当你作了向下兼容的功能性新增,能够理解为 Feature 版本
  • 修订号(patch):当你作了向下兼容的问题修正,能够理解为 Bug fix 版本

先行版本号及版本编译信息能够加到 “主版本号.次版本号.修订号” 的后面,做为延伸。

并且版本号都是递增的,在相同的位上递增、或者更高位递增,好比:'1.2.5.1' => '1.2.5.2'、'1.2.5.1' => '1.2.6.1'、'1.9.9.9' => '2.0.0.0'。

更详细的版本解释请看这里 语义化版本 2.0.0

比较方法

这样咱们能够作版本号比较,这里提供一个咱们项目中使用的方法,支持任意版本号位数的比较哦,好比 3 位的、4 位的。

// 3 位
Major_Version_Number.Minor_Version_Number[.Revision_Number]
主版本号            .子版本号              [.修正版本号]

// 4 位
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]
主版本号            .子版本号              [.修正版本号       [.编译版本号  ]]

之因此支持任意版本号位数的比较,是由于版本号都是递增的,而如下的方法是从左到右,一位一位的比较的。

js 代码:

/**
 * 版本比较 VersionCompare
 * @param {String} curVersion 当前版本
 * @param {String} supportVersion 比较版本
 * @return {Boolean} false 当前版本小于比较版本返回 true
 */
const versionCompare = (curVersion, supportVersion) => {
    if (!curVersion) {
        return false;
    }
    if (!supportVersion) {
        return false;
    }
    // 相等 也是比较关键的一步
    if (curVersion === supportVersion) {
        return true;
    }
    const curArr = curVersion.split('.');
    const supportArr = supportVersion.split('.');
    for (let i = 0; i < curArr.length; i += 1) {
        // 只有当两个版本号不相等才比较
        if (+curArr[i] !== +supportArr[i]) { 
            // 直接返回 结果,停止循环
            return +curArr[i] > +supportArr[i]; 
        }
    }
    return false;
};

使用也很简单:

js 代码:

// 3 位比较
versionCompare('1.3.3', '1.2.5'); // true
versionCompare('1.1.3', '1.2.5'); // false
versionCompare('1.2.5', '1.2.5'); // true

// 4 位比较
versionCompare('1.2.5.1', '1.2.5.1'); // true
versionCompare('1.2.3.4', '1.2.3.5'); // false
versionCompare('1.2.3.6', '1.2.3.5'); // true
versionCompare('1.3.3.4', '1.2.3.5'); // true

// 单 位上大于 10 的位进行比较
versionCompare('1.2.15.1', '1.2.5.1'); // true
versionCompare('1.2.15.1', '1.2.16.1'); // false

这里须要注意的是根据我本身的业务逻辑 当前版本小于比较版本返回 false,当前版本等于比较版本返回 true。

你能够根据本身的业务逻辑修改代码。

最后

有一段时间没写技术文章了啊 😂 实在惭愧。

下一篇原创应该是本身的年终总结了,今年的年终要比往年来得更晚一些,往年的年终总结都是 12 月下询就写好了的。

没办法,今年的 12 月份的确很忙,还没排上期,2020 的年终总结,会有 2021 年 1 月写好 😂 。

不过往年的年终总结能够先看一下:

相关文章
相关标签/搜索