1. 严格遵守"语义化版本规则(SemVer)"
当你在 package.json 看到类似 "axios": "^1.2.0" 时,那个 ^(脱字符) 就是规则。它代表:"允许升级小版本和补丁,但绝对不能升级大版本(破坏性更新)"。
- 如果旧版本是
1.2.0(有漏洞),官方推出了1.2.5(修复了漏洞):
由于符合^的规则,npm audit fix会自动帮你升级到1.2.5。 - 如果旧版本是
1.2.0(有漏洞),但官方必须在2.0.0大版本里才修复了它:
为了防止跨大版本导致你的代码语法直接崩溃(不兼容),npm audit fix会选择放弃自动升级,并继续保留这个漏洞。
2. 如果遇到规则不允许的"顽固漏洞"怎么办?
当运行完 npm audit fix 后,你会发现漏洞数量从 21 个减少到了几个,但很难变成 0。
剩下那些顽固漏洞,就是因为受到了 package.json 的版本限制,npm 不敢自作主张。此时终端会提示你:
"run
npm audit fix --forceto install breaking changes"
如果你加了 --force(强制) 参数,它才会真正做到"不管约束,强行直接升级到最新版"。但这极其危险,通常会导致大面积的框架报错、跑不起来。
3、为什么不一开始就下载安全的版本?
既然是全新安装,为什么明知道 1.2.5 是安全的,npm install 一开始却偏偏要装有漏洞的 1.2.0 呢?
因为项目中存在一个前端开发的"绝对死律"文件:package-lock.json(版本锁定文件)。
核心原因:你被 package-lock.json 强行"锁死"了
官方团队在开发和打包 的那一天,他们的电脑里安装的正是 1.2.0。
- 他们测试完发现没问题,于是执行了发布。
- 在发布时,Git 仓库里不仅有声明范围的
package.json,还有一个自动生成的package-lock.json。 package-lock.json的权力至高无上。它的唯一历史使命就是:百分之百精准记录当时安装的具体版本号(甚至包括文件的哈希值)。它记录的就是1.2.0。
为什么必须要锁死?(不锁死的灾难)
如果 npm 按照你的想法,每次新安装都自作主张去下载最新的 1.2.5,会发生什么?
- 两个月后,这个依赖的作者写错了一个 Bug,更新到了
1.2.9。 - 此时另一个新手克隆了 代码,
npm一开始就自作主张下载了最新的1.2.9。 - 结果这个新手的项目直接崩溃报错,而 官方团队在自己的电脑上运行
1.2.0却完全正常。团队根本无法帮这个新手排查错误。
为了保证 "任何人在世界上任何角落、任何时间克隆这套代码,装出来的运行结果都和作者一模一样",npm install 必须无条件服从 package-lock.json 的死命令,哪怕那个版本现在被爆出了漏洞,它也得硬着头皮装下去 。
什么时候才会纠正?
只有以下两种情况,它才会变成 1.2.5:
- 你主动下令:你运行
npm audit fix,主动告诉 npm:"打破锁定,把锁移到1.2.5去"。 - 官方团队更新:下一次修复 Bug 时,在他们的电脑上运行了升级,把新的
package-lock.json提交到了 GitHub 上。
4、为什么会修复了个寂寞
很多时候安装结束之后提示
added 1196 packages, and audited 1340 packages in 6m
219 packages are looking for funding
run `npm fund` for details
21 vulnerabilities (9 moderate, 12 high)
To address issues that do not require attention, run:
npm audit fix
To address all issues possible (including breaking changes), run:
npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.
你运行了 npm audit fix 之后满心期待他会修复完成。
然并卵~修复完了仍然是
21 vulnerabilities (9 moderate, 12 high)
哈哈,这就是前端著名的**"修复了个寂寞"**现场!这太正常了,几乎天天都在发生。
之所以执行了 npm audit fix 却还是雷打不动的 21 个漏洞。有以下原因
- 原因 1:它是一个"跨大版本"的漏洞。这个有漏洞的组件,官方必须在比如
4.x或5.x版本里才修复了它。 - 原因 2:package.json 锁死了它。
package.json限制了它只能在3.x版本内升级。因为跨大版本会带来代码不兼容(Breaking Changes),npm audit fix戴着鐐铐不敢逾矩,于是选择直接"躺平",什么都没改。
所以它才在下面明确提示你:
To address all issues possible (including breaking changes), run: npm audit fix --force
(意思是:如果你真想修,必须用
--force强行升级。但这样会触发不兼容,项目很可能会直接报红崩溃。)
5、行业潜规则:面对这 个漏洞,成熟开发者的做法是?
直接无视它,去跑你的 npm run dev!
为什么不用在意这 些漏洞?
- 这有可能是本地开发工具的漏洞:。这个工具只在你自己的电脑上运行(就是你写代码、热更新的那个黑窗口)。
- 它不会被打包上线:当你未来执行
npm run build生成前台网站和后台网页时,这些"本地开发服务器"的依赖会被全部彻底剔除,根本不会传到服务器上。 - 让AI看日志找原因处理,慌个毛线