功能说明
parseSemVer 校验并解析符合 SemVer 2.0.0 的版本字符串,compareSemVer 按规范比较两个版本,sortVersions 返回升序排列的新数组。比较顺序依次为主版本、次版本、补丁;核心版本相同时,没有预发布标识的版本高于任何预发布版本,预发布标识之间按点分隔逐段比较:数字段按数值比较,字母数字段按 ASCII 字典序比较,数字段总是低于字母段。
解析器拒绝前导零的核心版本号和非法的预发布数字标识,但允许构建元数据并忽略其排序影响。它适合实现版本排序、依赖升级检查、CLI 的 --version 比较和发布说明生成。
关键代码
核心版本逐段比较,避免大数相减溢出;预发布阶段先处理“正式版高于预发布版”的规则:
if (left.major !== right.major) return left.major < right.major ? -1 : 1;
if (left.minor !== right.minor) return left.minor < right.minor ? -1 : 1;
if (left.patch !== right.patch) return left.patch < right.patch ? -1 : 1;
if (left.prerelease.length === 0) return 1;
if (right.prerelease.length === 0) return -1;
后续循环在某一侧标识先用完时,较短的一侧视为更小;全部相同则返回 0。
使用注意
构建元数据(+build.5)不参与优先级比较,因此 1.0.0+build.5 与 1.0.0+build.9 返回 0;如果业务需要区分构建号,必须额外比较原始字符串。功能比较不处理版本范围表达式,如 ^1.2.0、~1.2 或 >=1.0.0 <2.0.0,需要另写范围解析器。
预发布标识只允许 ASCII 字母、数字和连字符,数字标识不能有前导零。解析器会 trim 输入,因此前后空白不会导致失败,但内部空白会。sortVersions 使用稳定排序,排序值相等时保留输入顺序;返回的是原字符串而不是规范化后的形式。对超长版本号或超大数字会抛错,不会静默截断。
验证方式
示例对一组版本排序,结果应为 alpha、alpha.1、beta.2、rc.1、1.0.0、1.0.1、2.0.0,体现预发布版本低于正式版。比较两个仅构建元数据不同的版本应返回 0;比较 alpha.10 与 alpha.2 应返回 1,证明数字标识按数值而非字典序比较。解析 01.0.0 应抛出 invalid semantic version。