区别项目依赖包版本号、npm install命令详解

739 阅读3分钟

写在前面

当我们查看package.json中安装的库(也就是依赖配置)的时候,会发现有的库的版本号前面会加一个符号,有的是插入符号^, 有的是波浪符号~, 而有的就只是单纯的数字, 有的是>,有的是'>=', 有的是'<',有的是<=, ... (不一一列举了,下文具体提到), 那下面我们来看看它们到底有什么含义,区别又在哪。

下面我们来仔细分析一下 ^ ~ > >= < <= x范围 '' * x-x (x || x || x) 这些符号的代表含义

"babel-core": "7.0.0-bridge.0",
"babel-eslint": "^10.0.1",
"babel-jest": "~23.6.0",

npm安装依赖

当我们用最新的node使用npm install 或者 npm install --save 或者 npm install --save-dev 安装时,优先会使用插入符号^而不是波浪线~。之前默认优先安装~而不是^

比如

npm install babel-loader --save-dev

查看package.json,得到的是:

"babel-loader": "^8.2.5"

各个符号的含义

^

"babel-loader": "^8.2.5"
它会将当前版本更新到当前major version(主要版本)(也就是第一个数字)中的最新版本,也就是说babel-loader这个库会匹配8.x.x中最新的版本,但是它不会自动更新到9.0.0这个版本。

可以这样表达:

8.2.5 <= ^8.2.5 < 9.0.0

~

"babel-loader": "~8.2.5"
它会将当前版本更新到当前minor version(次要版本)(也就是第二个数字)中的最新版本,也就是说babel-loader这个库会匹配8.2.x中最新的版本,但是它不会自动更新到8.3.0这个版本。

可以这样表达:

8.2.5 <= ~8.2.5 < 8.3.0

>

"babel-loader": ">8.2.5" \

>version: 大于该版本号,指定所依赖的该库必须是大于8.2.5这个版本的

>=

"babel-loader": ">=8.2.5" \

>=version: 大于或者等于该版本号,指定所依赖的该库必须是大于或者等于8.2.5这个版本的

<

"babel-loader": "<8.2.5" \

<version: 小于该版本号,指定所依赖的该库必须是小于8.2.5这个版本的

<=

"babel-loader": "<=8.2.5" \

<=version: 小于或者等于该版本号,指定所依赖的该库必须是小于或者等于8.2.5这个版本的

x范围

x范围 x-version x位置任意

// 也就是x位置任意 可以是0到9

"babel-loader": "8.2.x" 
"babel-loader": "8.x.5" 
"babel-loader": "x.2.5" 

'' 或者 *

// 版本任意

"babel-loader": ""
"babel-loader": "*"

x-x

// 区间的意思 8.2.5 <= 版本号 <= 8.2.8

"babel-loader": "8.2.5 - 8.2.8"  

(x || x || x)

// 支持多个 满足其中任意版本即可

"babel-loader": "8.2.5 - 8.2.8 || >=8.4.0 || ^0.1.2 " 

版本号的含义

node中的版本号都是由3个数字用(.)连接起来的,三个数字的含义分别为major(主要), minor(次要), patch(补丁)。

例如:8.2.5 对应的major.minor.patch // 8是主,2是次,5是补丁

major(主): 这个版本号变化了表示有了一个不可以和上个版本兼容的更新,表示可能会影响之前版本的兼容性,所以无论是波浪符号还是插入符号都不会自动去修改major version版本,因为这可能导致程序奔溃运行不起来,可能需要手动修改代码。

minor(次): 这个版本号变化表示增加了新功能,并可以向后兼容。

patch(补丁): 这个版本号变化了表示修复了bug,并可以向后兼容


npm install、npm install --save与npm install --save-dev区别

npm5.0.0之前

npm install x

  • 会把x包安装到node_modules目录中
  • 不会修改package.json
  • 之后运行npm install 命令,不会自动安装x

npm install x --save

  • 会把x包安装到node_modules目录中
  • 会在package.json的dependencies属性下添加x
  • 之后运行npm install命令时,会自动安装x到node_modules目录中
  • 之后运行npm install --production或者注明NODE_ENV变量值为production时,会自动安装msbuild到node_modules目录中

npm install x --save-dev

  • 会把x包安装到node_modules目录中
  • 会在package.json的devDependencies属性下添加x
  • 之后运行npm install命令时,会自动安装x到node_modules目录中
  • 之后运行npm install --production或者注明NODE_ENV变量值为production时,不会自动安装X到node_modules目录中

总结

  • npm install只是将依赖下到本地,不会修改package.json
  • npm install -save会将依赖下载到本地,并且会修改package.json。提交代码后别人下载下来,npm install就可以跟你保持依赖一致
  • npm install --save-dev表示只在开发环境使用这个依赖,比如jest(JavaScript 测试包依赖)。如果将项目打包时,这个依赖并不会加入到构建包中,类似于maven中<scope>test</scope>,只对test包下有用,构建出来的包并不包含该依赖。

package.json最终在build构建项目的时候,dependencies下面的所有依赖都会被打包上去,最终dist文件夹里面的代码会包含这些依赖。 devDependencies只用于开发时候的依赖,最终项目不用依赖这些依赖,不会出现再dist文件夹里面的代码里。

npm5.0.0之后

npm install 和 npm install --save 是等价的,所以--save可以省略。

查看npm或者npm install 的其他命令

npm -h // 查看npm其他命令

截屏2022-08-27下午1.59.05.png

npm install -h // 查看npm install的其他选项或者用法

截屏2022-08-27下午1.59.42.png

总结为一句话:运行时需要用到的包使用--save,否则使用--save-dev。