秒懂NPM依賴包版本號~和^的區別

你是不是也和我一樣,總忘記~和^的區別?(哈哈,或者你壓根就不知道?)
今天盯着semver的api看了很久(😂源碼就不看了,真是的又長又醜),感覺是看到它的規律了。

我們常見的大概有這些:

  • ~1.0.0(^1): >=1.0.0 <1.1.0 ( >=1.0.0 <2.0.0)
  • ~1.0.1(^1.0.1): >=1.0.1 <1.1.0 (>=1.0.1 <2.0.0)
  • ~1.1.0(^1.1.0): >=1.1.0 <1.2.0 (>=1.1.0 <2.0.0)
  • ~1.1.1(^1.1.1): >=1.1.1 <1.2.0 (>=1.1.1 <2.0.0)
  • ~0.1.1(^0.1.1): >=0.1.1 <0.2.0 (>=0.1.1 <0.2.0)
  • ~0.1.0(^0.1.0): >=0.1.0 <0.2.0 (>=0.1.0 <0.2.0)
  • ~0.0.1(^0.0.1): >=0.0.1 <0.1.0 (>=0.0.1 <0.0.2)
  • ~0.0.0(^0): >=0.0.0 <0.1.0 (>=0.0.0 <0.0.1)
    ~1.1.0-beta(^1.1.0-beta): >=1.1.0-beta <1.2.0 (>=1.1.0-beta <2.0.0)

以上的大概可以覆蓋我們常見的一些情況了,下面分析一下semver是怎麼判斷的。

1、首先我們把版本分爲a、b、c、xx四個位置: a-b-c-xx
2、最小範圍不管是“~xxx”還是“^xxx”都是>=xxx
3、最大範圍
如果爲“~”:取a、b位,a、b位都有的時候直接b位+1,如“~1.1.0”取“1.(1+1).0”, 只有a位的時候“a位+1”,如“~1”取:“ (1+1).0.0”
如果爲“^”: 直接從右到左去除無效的0然後看成一個數字,最大位數+1就可以了
比如
1.0.0可以看成100,也就是2.0.0
0.1.1看成11, 也就是0.(1+1).0
0.1.0看成10,也就是0.(1+1).0
0.0.0看成0, 也就是0 .0.(0+1)
以下是我的測試代碼:

const semver = require("semver");
const data = "^3.1.4";
const result = ">=3.1.4 <4.0.0";
const validRange = semver.validRange(data);
console.assert(validRange===result);

還沒看源碼的,不過規則應該差不多吧,如果描述有誤還麻煩小夥伴告知一聲,歡迎志同道合的小夥伴一起學習,一起交流,一起進步,歡迎入羣!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章