npm版本管理规范

5,121 阅读3分钟

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 installyarn install之后,本地会生成 一个package-lock.jsonyarn.lock,其作用是:(参考官网)

  1. 既然版本是可以动态匹配的,那么不同环境不同npm版本可能安装到不同的node_modules版本,为了确保团队成员、线上部署和持续集成能够安装完全相同的依赖包(以免酿成大祸),需要一个详细描述依赖关系树的文件
  2. 是快速查看当前安装的所有node_modules依赖包以及各包间依赖关系的一个工具
  3. 通过查看git的提交记录可以快速查看版本更改历史,便于定位问题
  4. 通过允许npm跳过以前安装的包的重复元数据解析,优化安装过程。
  5. npm v7开始package-lock.json会包含更多的包信息,方便进行包管理与分析

⚠ npm 和 yarn会有不同的包树结构,故两种安装方式建议不要混用,当心爆炸🤭,解决方法是删掉node_modules再用另外一种命令进行install

In conclusion

想要保证项目迁移不爆雷,在版本范围管理上可以参考以下方法:

  • 管理比较规范的包(也就是严格遵循SemVer来进行开发版本管理)可以使用^进行指定范围,以随时享受版本功能升级带来的优势;

  • 信不过的(无法确定是否规范的)可以使用~,只安装修订版;

  • 再信不过的,就锁定版本,缺点就是可能该版本的一些已知bug永远都没法修复

  • 最后一个原则就是,坑,踩过后自然就知道了 😀

此时可能有人要问了,能不能在本地环境灵活切换不同版本的node/npm呢,答案是有的,就是 NVM ,而且,真的很灵活好用,windows的同志可参考 装个nvm而已!- windows安装node版本管理工具nvm踩坑

本文参考文档:

NPM Version Management Specification

SemVer

npm docs