semver 把版本号拆成三段:主版本表示不兼容的破坏性更新,次版本表示向下兼容的新增功能,修订号表示向下兼容的缺陷修复。依赖区间的写法各有含义:脱字符允许次版本内升级(如 ^1.2.3 可装到 1.9.9),波浪号只允许修订号升级(如 ~1.2.3 到 1.2.9),精确版本号则完全锁死。
发布 npm 包必须遵守这套规范:只要不破坏兼容性,就只升次版本或修订号。npm version 命令可以自动改 package.json 中的版本号并打上对应 git 标签。package.json 的 engines 字段也用它约束 Node 版本,例如写成大于 18 的区间。
const semver = require('semver'); semver.valid('1.2.3'); // true semver.gt('1.3.0', '1.2.9'); // true semver.satisfies('1.4.1', '^1.2.3'); // true(次版本内都兼容) semver.satisfies('2.0.0', '^1.2.3'); // false(主版本不兼容) // package.json 中声明依赖区间 // "lodash": "^4.17.21" // "eslint": "~8.50.0" // "react": "18.2.0" 精确锁定,不拿任何更新