Node.js中package.json中库的版本号详解(^和~区别)
当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号(~)。那么他们到底有什么区别呢?先贴一个例子,对照例子来做解释:
{
"name": "vue-ssr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node server/server.js",
"dev": "webpack-dev-server --config config/webpack.client.config.js",
"build:client": "webpack --config config/webpack.client.config.js",
"build:server": "webpack --config config/webpack.server.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"koa": "^2.11.0",
"koa-router": "^8.0.8",
"koa-static": "^5.0.0",
"vue": "^2.6.11",
"vue-router": "^3.2.0",
"vue-server-renderer": "^2.6.11",
"vuex": "^3.4.0"
},
"devDependencies": {
"@babel/core": "^7.9.6",
"@babel/preset-env": "~7.9.6",
"autoprefixer": "^9.7.6",
"babel-loader": "^8.1.0",
"css-loader": "^3.5.3",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^6.0.0",
"html-webpack-plugin": "^4.3.0",
"postcss": "^7.0.30",
"postcss-loader": "^3.0.0",
"style-loader": "^1.2.1",
"url-loader": "^4.1.0",
"vue-loader": "^15.9.2",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2"
}
}
@babel/core版本号:^7.9.6
@babel/preset-env版本号:~7.9.6
当我们使用最新的Node运行‘npm instal –save xxx’,的时候,他会优先考虑使用插入符号(^)而不是波浪符号(~)了。
这对于你来说意味这什么呢?首先我们需要理解这两者(~和^)的区别。
波浪符号(~):他会更新到当前minor version(也就是中间的那位数字)中最新的版本。放到我们的例子中就是:@babel/preset-env:~7.9.6,这个库会去匹配更新到7.9.x的最新版本,如果出了一个新的版本为7.10.0,则不会自动升级。波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
插入符号(^):这个符号就显得非常的灵活了,他将会把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。放到我们的例子中就是:@babel/core:^7.9.6,这个库会去匹配8.x.x中最新的版本,但是他不会自动更新到8.0.0。
总结一下:
~7.9.6 := >=7.9.6 <7.10.0
^7.9.6 := >=7.9.6 <8.0.0
最后解释下之前提到的minor verision和major version:
1.15.2对应就是MAJOR,MINOR.PATCH:1是marjor version;15是minor version;2是patch version。
MAJOR:这个版本号变化了表示有了一个不可以和上个版本兼容的大更改。
MINOR:这个版本号变化了表示有了增加了新的功能,并且可以向后兼容。
PATCH:这个版本号变化了表示修复了bug,并且可以向后兼容。
因为major version变化表示可能会影响之前版本的兼容性,所以无论是波浪符号还是插入符号都不会自动去修改major version,因为这可能导致程序crush,可能需要手动修改代码。