1. 版本控制
npm依赖包使用语义化的版本号,让开发者可以从版本号中推测修改。
版本号格式为:X.Y.Z
X:代表主版本号,只有更新了不向下兼容的API时才需要修改
Y:次版本号,当模块增加了向下兼容的功能时需要修改
Z:补丁版本号,当模块进行了向下兼容的bug修改时需要修改
npm有些符号可以用来限制版本,并且不同的符号有不同的更新版本号的规则
- 脱字符^,限定了安装版本的主版本号
用npm install下的依赖,写入package.json中时,就是使用的脱字符限定了版本号
"ajax": "^0.19.0",
"ava": "^1.3.1",
"babel-loader": "^8.0.5",
当我们执行 npm update packageName时,因为使用了脱字符限定了主版本号(其他符号更新时,也与符号相关),所以只会更新该大版本号下的次版本号和修订版本号更高的版本。但是有种情况例外,当主版本号为0时,这种是不稳定的版本,所以尽管用脱字符限制,但是次版本号一样不会更新,只会更新修订版本号
例:版本 ^1.2.1,可更新的范围是 >1.2.1 && <2.0.0
例:当安装了axios的0.1.0的版本,执行 npm update axios --ddd (调试,查看过程)。
没有更新,因为没有大于0.1.0的0.1.x版本
- 波浪号~,限定次要版本号
例:~1.5.1代表可更新范围为>=1.5.1 && =< 1.6.0 - x,X,*和空可以替代版本号中的任意一段,表示该位置版本号没有限制
例:x,X,*和空可以匹配任何版本(本地测试安转时,会安装最新版本)
1.x,可更新范围是 >=1.0.0 && =<2.0.0 - 无符号,指定版本,如使用 vue-router: 3.0.7 只会安装这个版本号的依赖
npm install会安装满足条件的最新版本。
问题:
- 如何升级大版本号?
npm install packageName@Y - 如何降级版本号?
npm install packageName@oldVersion
2. 版本锁定
为什么需要锁定依赖的版本?
在package.json中axios的依赖是 "axios": "^0.8.0",执行npm install时会安装哪个版本?
- 安装了版本0.8.1
明明在package.json中写的是0.8.0,为什么安装的是0.8.1?这版本不一样啊?
- 因为准确的说package.json中写的不是版本0.8.0,而是^0.8.0,前者是一个确定的版本,而后者是一个版本范围。0.8.1是满足这个条件的最新版本。
那么问题来了,这种依赖安装的方式,那我们在本地开发和正式线上前的安装,当需要多人协同开发的时候,安转的依赖版本有可能不一样。这样可能就会导致一些,“我这里是好的,本地环境是好的”的奇怪问题。
那我们要怎么解决这个问题,使地大家都能安装同一个版本的依赖?
npm在5.0.0(但在5.6.x的版本中才稳定下来)的版本中增加了package-lock.json文件,在此版本和更高的版本中,使用npm install时会自动生成此文件。
"axios": {"version": "0.8.1","resolved": "http://registry.npm.oa.com/axios/download/axios-0.8.1.tgz","integrity": "sha1-4Or+wPNGE5Un3Dt5/cv/gDSiQEU=","dev": true,"requires": {"follow-redirects": "0.0.7"}}
lock文件中有这个依赖安装的特定版本、下载地址、验证模块完整性的hash以及它的依赖列表。
当项目中有package-lock.json文件时,会根据此文件安装版本。使用npm更新依赖,则package-lock.json文件会被更新,package.json文件可能会更新(有时候不会,比如上面的axios的更新补丁版本号)。
那如果我手动修改了package.json文件,它和lock文件不一致了会怎么样?
- 如果是在package.json中增加或删除了依赖,npm install后会同步增加和删除
- 如果是对版本号进行了修改
1. 如果修改后的版本不是之前范围中符号固定不变的部分,则lock中的会跟着修改。
如图,我将package.json中的axios由0.8.0改为了0.7.0,将vue-router由3.0.7改为了2.0.0
2. 如果修改后的版本没有影响之前固定不变的部分,lock文件不会修改
如图,我将package.json中的element-ui由2.10.1改为了2.9.1
lock文件中的并没有改变,因为它的版本依旧是满足依赖的新范围,此时不一定是最新范围。
所以在依赖降级时,要注意直接修改package.json中的版本号可能行不通。
当我们安装依赖时版本不对,可能会删掉package-lock和node_modules,重新npm install。
这种方式可能会导致,之前锁定的版本被更新。
比如以前的lock锁定了2.10.1,但是之后出来了2.10.2,重新install时,会安装后一个版本。
3. package.json中的依赖分类
1)dependencies: 项目运行时的依赖
2)devDependencies: 项目开发时的依赖。
线上环境,可以使用npm install --production忽 略开发依赖。
3)peerDependencies: 项目当前依赖所在的宿主环境所需要安装的依赖和版本
例如,element-ui的peerDependencies中有vue。如果安装element-ul,没有安装vue,npm就会警告。
参考文章:
2018 年了,你还是只会 npm install 吗?juejin.im前端工程化(5):你所需要的npm知识储备都在这了 - 掘金juejin.im