前端工程化必備,語義化版本號掃盲,支持任意版本號位數的比較方法

由於最近在作 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 月寫好 😂 。

不過往年的年終總結能夠先看一下:

相關文章
相關標籤/搜索