写在前面
当我们查看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.jsonnpm 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其他命令
npm install -h // 查看npm install的其他选项或者用法
总结为一句话:运行时需要用到的包使用--save,否则使用--save-dev。