npm用了多年,很多人却都对npm包管理规范不甚了解或者一知半解(包括本人),在踩过一些坑后,觉得该好好深入了解一下,否则何面目见江东父老。今天就来好好捋一下吧!
Q: 版本号是如何定义的?
语义化版本控制规范SemVer
版本格式:X.Y.Z[-string]
X: 主版本号; Y: 子版本号; Z: 修正版本号; string: 先行版本号及版本编译信息,如1.0.0-x.7.z.92
(1)项目初版本时,版本号可以为 0.1.0;
(2)当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号(即z)+ 1,如升级为0.1.x;
(3)项目正式上线的版本号应该是1.0.0
(4)当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号(即y)+ 1,修正版本号复位为 0,如升级为 1.x.0;
(5)当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时(或者说无法向下兼容),主版本号(即x) +1, 其他两位归0, 如升级为 x.0.0;
参考:SemVer
Q: npm安装依赖包的时候到底是怎么匹配版本的呢?
版本范围规则
空锁定版本号,比如1.2.3,则每次只会安装对应的版本,一般不建议使用(如果该版本有bug,则可能永远都修复不了)x、X、*代替X.Y.X中的某一位或多位,缺省位置为任意版本号如:1.x.x 匹配主版本号1的所有版本,x、X、* 三个符号等效~会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,但是不会升级到2.0.0<、<=、>、>=、=指定版本范围,可通过||来进行多条件组合如: 1.2.3 || >= 1.3.0 < 1.4.0
Q: 怎么保证安装到我想要的版本?
锁定版本/控制版本
当首次执行npm install 或 yarn install之后,本地会生成 一个package-lock.json或yarn.lock,其作用是:(参考官网)
- 既然版本是可以动态匹配的,那么不同环境不同npm版本可能安装到不同的node_modules版本,为了确保团队成员、线上部署和持续集成能够安装完全相同的依赖包(以免酿成大祸),需要一个详细描述依赖关系树的文件
- 是快速查看当前安装的所有node_modules依赖包以及各包间依赖关系的一个工具
- 通过查看git的提交记录可以快速查看版本更改历史,便于定位问题
- 通过允许npm跳过以前安装的包的重复元数据解析,优化安装过程。
- npm v7开始package-lock.json会包含更多的包信息,方便进行包管理与分析
⚠ npm 和 yarn会有不同的包树结构,故两种安装方式建议不要混用,当心爆炸🤭,解决方法是删掉node_modules再用另外一种命令进行install
In conclusion
想要保证项目迁移不爆雷,在版本范围管理上可以参考以下方法:
-
管理比较规范的包(也就是严格遵循SemVer来进行开发版本管理)可以使用
^进行指定范围,以随时享受版本功能升级带来的优势; -
信不过的(无法确定是否规范的)可以使用
~,只安装修订版; -
再信不过的,就锁定版本,缺点就是可能该版本的一些已知bug永远都没法修复
-
最后一个原则就是,坑,踩过后自然就知道了 😀
此时可能有人要问了,能不能在本地环境灵活切换不同版本的node/npm呢,答案是有的,就是 NVM ,而且,真的很灵活好用,windows的同志可参考 装个nvm而已!- windows安装node版本管理工具nvm踩坑
本文参考文档: