npm audit 修复后为什么还有高危漏洞?

Mr-子怡 阅读 58

我刚跑完 npm audit fix,结果提示“fixed 5 of 12 vulnerabilities”,但剩下的 7 个还是高危。我查了下,有些是间接依赖,比如通过某个 UI 库引入的旧版 lodash。手动升级主依赖也没用,因为那个 UI 库还没更新。现在项目要上线,安全扫描过不了,真不知道该怎么处理这些“卡住”的漏洞了。

有没有办法在不 fork 第三方库的情况下,强制替换掉有问题的子依赖?比如用 resolutions 字段?我试过在 package.json 里加:

{
  "resolutions": {
    "lodash": "^4.17.21"
  }
}

但好像只对 yarn 有效,我们项目用的是 npm……是不是得换包管理器才行?还是有别的解法?

我来解答 赞 11 收藏
二维码
手机扫码查看
1 条解答
慕容雨萱
这个问题太常见了,很多项目都遇到过。先说结论:npm 其实也有类似的功能,不过不叫 resolutions,叫 overrides,而且字段名和语法都有点区别。

npm 的 overrides 字段

从 npm 8.3 版本开始(也就是 Node 16+ 对应的 npm 版本),你可以用 overrides 字段来强制替换子依赖。resolutions 那个字段是 yarn 先搞的,npm 虽然后来也支持了,但官方推荐用 overrides。

在你的 package.json 里这样写:

{
"name": "your-project",
"version": "1.0.0",
"overrides": {
"lodash": "4.17.21"
}
}


这样会强制项目中所有版本的 lodash 都用 4.17.21,包括通过那个 UI 库引入的旧版。

如果只想替换特定包下面的 lodash,可以这样:

{
"overrides": {
"some-ui-library": {
"lodash": "4.17.21"
}
}
}


为什么 overrides 能生效

npm 在安装依赖时会检查 overrides 字段,如果有匹配的就会强制使用你指定的版本,忽略子依赖声明的版本号。这相当于告诉 npm:“别管那个 UI 库说要什么版本的 lodash,我就要用这个”。

操作步骤

第一步,确认你的 npm 版本够新:

npm --version


如果是 8.3 以上就直接用 overrides。

第二步,修改 package.json 添加 overrides 字段。

第三步,删掉 node_modules 和 package-lock.json:

rm -rf node_modules package-lock.json


第四步,重新安装:

npm install


第五步,再跑一遍 audit 看看:

npm audit


需要注意的点

overrides 会影响所有引用那个包的代码,如果新版本有 breaking change 可能会出问题。不过 lodash 4.17.21 是小版本升级,兼容性一般没问题。

如果 overrides 不生效(比如 npm 版本太旧),你可以考虑升级 npm:

npm install -g npm@latest


或者真的想省事,yarn 的 resolutions 确实更成熟,用法也简单:

{
"resolutions": {
"lodash": "4.17.21"
}
}


跑完 yarn install 或 yarn-deduplicate 就行。不过换包管理器涉及团队协作成本,你自己权衡。

基本上 overrides 就是你要的方案,不用 fork 第三方库,也不用换 yarn。试试看能不能把那些漏洞修掉。
点赞
2026-03-17 03:00