Npm 包版本控制符号 ^和~

在我们查看 package.json 中需要的包的依赖的时候通常有 2 个部分,第一个部分为包的名称,第二个部分为版本号。

我们来说说这个版本号。

如果版本号之前没有任何符号,这个就非常明确了,表示的是我就只安装这个特定的版本。

但是为了避免我们不停的更新版本控制文件,我们又同时可以使用通配符来确保版本能够正常的更新到最新的版本。

例如我们在一个项目中对有关需要的包的版本的定义:

  "dependencies": {
    "@microsoft/sp-component-base": "1.18.0",
    "@microsoft/sp-core-library": "1.18.0",
    "@microsoft/sp-lodash-subset": "1.18.0",
    "@microsoft/sp-office-ui-fabric-core": "1.18.0",
    "@microsoft/sp-property-pane": "1.18.0",
    "@microsoft/sp-webpart-base": "1.18.0",
    "@pnp/sp": "^3.23.0",
    "bootstrap": "^5.3.2",
    "fancybox": "^3.0.1",
    "jpictura": "^1.2.3",
    "jquery": "^2.2.4",
    "tslib": "~2.3.1",
    "unitegallery": "^1.7.28"
  },

版本语义

semver 版本的规范是X.Y.Z

  • X 主版本号(major):当你做了不兼容的API修改(可能不兼容之前的版本)
  • Y 次版本号(minor):当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本)
  • Z 修订号(patch):当你做了 向下兼容的问题修真(没有新功能,修复了之前版本的bug)

特殊符号

在特定的版本之前,我们可以添加一些符号,这些符号的意思就是能够让特定的版本进行一定程度的更新,这种我们一般称之为大概的版本

这 2 个符号就是 ^ 和 ~ 符号。

  • ^x.y.z:表示x是保持不变的,y和z永远安装最新的版本。
  • ~x.y.z:表示x和y不变,z永远安装最新的版本。

插入符号(^) :这个符号就显得非常的灵活了,他将会把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。

放到我们的例子中就是:“jquery”: “^2.2.4”,这标识的是在安装的时候会去匹配,这个库会去匹配 2.x.x中最新的版本,但是他不会自动更新到 4.0.0。

波浪符号(~):他会更新到当前 minor version(也就是中间的那位数字)中最新的版本。放到我们的例子中就是:“tslib”: “~2.3.1”,这个库会去匹配更新到2.3.x 的最新版本,如果出了一个新的版本为2.4.0,则不会自动升级。

波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。