包废弃与peer问题
包废弃与peer问题是 Node.js 开发中的“两座大山”,理解这两个概念对于维护长期项目至关重要。
包废弃与peer问题
1. 💀 Deprecated Warning (废弃警告)
—— “超市里的过期原料”
现象
日志里显示:
WARN 12 deprecated subdependencies found: abab@2.0.6, glob@7.1.6, rimraf@2.6.3...
它是怎么来的?
这通常不是你直接安装的包,而是你安装的包里面引用的包(子依赖)。
- 类比:你去餐厅点了一个汉堡(你安装了
jest)。汉堡本身没过期,但做汉堡用的沙拉酱(glob)厂家已经发布公告说:“这批沙拉酱配方太老了,有健康风险,我们不再维护了,请改用新版。” - 原因:
- 改名了:比如作者把包从
a改名成了@scope/a。 - 有漏洞:旧版本被发现有安全隐患。
- 彻底烂尾:作者弃坑了,不再更新。
- 改名了:比如作者把包从
为什么很难修?
因为这是层层嵌套的。
你自己并没有在 package.json 里写 glob,是 A 依赖了 B,B 依赖了 C,C 依赖了 glob。
要想消除警告,你必须升级 A,期待 A 的新版里升级了 B,B 的新版里升级了 C……如果 A 的作者很懒没升级,你就卡住了。
你的日志分析
你的日志里有很多 rimraf@2.x 和 glob@7.x。这两个是 Node 界著名的“钉子户”。虽然现在都出到 rimraf 6 和 glob 11 了,但成千上万的老库还在用旧版。
- 危害:通常只是看着烦。除非涉及
High Severity安全漏洞,否则开发环境下一般可以忽略。 - 解决:运行
pnpm outdated尽量升级你的直接依赖,通常能顺带解决一部分子依赖过期问题。
2. 🤝 Peer Dependency Issues (对等依赖冲突)
—— “PS5 游戏碟与游戏机”
现象
日志里显示:
✕ unmet peer eslint@"^8.0.0": found 9.39.1
它是怎么来的?
Peer Dependency 是一种特殊的依赖关系,通常用于插件系统。
- 类比:你买了一张《黑神话:悟空》的光盘(插件)。光盘包装盒上写着:“需要 PS5 游戏机(宿主环境)才能运行”。
- 光盘里不包含游戏机(为了省成本、避免重复)。
- 厂家假设你家里已经有一台 PS5 了。
- 冲突点:
- 情况 A (太旧):你家里只有 PS4(你的版本低于要求)。
- 情况 B (太新):你买了还未发布的 PS6,但游戏只认 PS5(你的版本高于插件支持的范围)。
你的日志详细复盘
让我们看看你遇到的两个具体冲突,这非常典型:
案例 1:版本太旧 (SWC)
unmet peer @swc/core@">= 1.13.3": found 1.5.29
-
插件要求:
@swc-node/core说:“我要配合 SWC 核心库使用,版本至少要 1.13.3(一点一三)”。 -
你实际安装:你装的是 1.5.29(一点五)。
-
数学问题:在语义化版本(SemVer)中,13 大于 5。所以你的版本严重落后了。
-
解决办法:手动升级 SWC。
pnpm add -D @swc/core@latest
案例 2:版本太新 / 破坏性更新 (ESLint)
unmet peer eslint@"^3... || ^8.0.0-0": found 9.39.1
- 插件要求:
eslint-plugin-react-hooks说:“我支持 ESLint 3 到 8。” - 你实际安装:你装了最新的 ESLint 9.39.1。
- 核心矛盾:ESLint 9 发布了全新的配置系统(Flat Config),彻底打破了与 ESLint 8 的兼容性。旧版插件根本不认识 ESLint 9。
- 解决办法:
-
升级插件:去看
eslint-plugin-react-hooks有没有发布支持 v9 的新版(通常是5.1.0以上)。pnpm add -D eslint-plugin-react-hooks@latest -
如果插件还没适配:你就只能暂时降级 ESLint 到 v8,或者等待插件作者更新。
-
检测这两个问题
pnpm install 时会显示
// 检查有哪些“烂包” (Outdated)
pnpm outdated -r
# -r 表示 recursive(递归检查所有子项目)
# 个命令会列出你所有**直接依赖**的版本健康度。
// 查谁在使用废弃包 (Why)
pnpm why glob -r
// 查安全漏洞 (Audit)
pnpm audit
🛠️ 总结与实战建议
对于这两种问题,处理优先级如下:
-
Peer Dependencies (红色/✕):必须解决。
- 这直接关系到代码能不能跑。版本不匹配可能导致插件无法启动、报错或功能缺失。
- 动作:要么升级插件适配宿主,要么调整宿主适配插件。
-
Deprecated (黄色/WARN):看情况。
- 如果是你自己安装的包(直接依赖),尽快替换。
- 如果是深层子依赖(如
glob,rimraf),只要项目能跑,且不是严重安全漏洞,可以暂时无视。这是整个 Node.js 生态的历史包袱,个人很难凭一己之力清理干净。
针对你现在的仓库,下一步操作:
你的仓库目前处于 ESLint 9 升级阵痛期 和 SWC 版本过旧 的混合状态。请执行以下命令来修复最关键的 Peer 问题:
# 1. 升级 SWC 核心以满足要求
pnpm add -D -w @swc/core@latest
# 2. 升级 React Hooks 插件以支持 ESLint 9
pnpm add -D -w eslint-plugin-react-hooks@latest
# 3. 重新安装
pnpm install