波浪号(~)仅允许补丁版本(PATCH)升级,如"lodash": "~4.17.21"匹配4.17.21至

波浪号(~)和 caret(^)都是 npm 用来控制依赖自动更新范围的符号,区别核心在于它们各自允许升级的版本段不同。
~ 只允许补丁版本(PATCH)升级
它锁定主版本号(MAJOR)和次版本号(MINOR),只放开补丁号(PATCH)的更新空间。
-
"lodash": "~4.17.21"→ 实际允许安装4.17.21到的任意版本,比如4.17.22、4.17.25,但不会装4.18.0或更高 - 对
~0.13.0同样适用:只升到,即0.13.x范围内 - 适合追求稳定、怕功能变动影响现有逻辑的项目,尤其是生产环境或关键依赖
^ 允许次版本(MINOR)和补丁版本(PATCH)升级
它锁定最左边非零的主版本号,其余低位全部放开(前提是语义化版本规则被严格遵守)。
-
"axios": "^1.6.7"→ 实际允许安装1.6.7到的任意版本,比如1.7.0、1.12.3,但不会装2.0.0 - 特殊情形:
^0.13.0只允许到(因为 0.x 是不稳定阶段,npm 把它当作“主版本”来对待) - 适合开发阶段或信任上游维护者能守 SemVer 规则的场景,可更快获得新功能和修复
怎么选更稳妥
没有绝对标准,但可以按风险偏好来判断:
- 用
~:想最小化变更风险,只要 bug 修复,不想要新功能干扰 - 用
^:接受合理的新特性,相信包作者会正确标注主版本升级 - 完全不用符号(如
"react": "18.2.0"):彻底锁定版本,配合package-lock.json保证所有环境一致 - 搭配
npm install --save-exact可直接写死版本,避免符号带来的不确定性











