包废弃与peer问题

包废弃与peer问题是 Node.js 开发中的“两座大山”,理解这两个概念对于维护长期项目至关重要。

#status / growing #tech / dev / frontend / eng #type / debug

包废弃与peer问题

1. 💀 Deprecated Warning (废弃警告)

—— “超市里的过期原料”

现象

日志里显示:

WARN 12 deprecated subdependencies found: abab@2.0.6, glob@7.1.6, rimraf@2.6.3...

它是怎么来的?

这通常不是你直接安装的包,而是你安装的包里面引用的包(子依赖)。

  • 类比:你去餐厅点了一个汉堡(你安装了 jest)。汉堡本身没过期,但做汉堡用的沙拉酱(glob)厂家已经发布公告说:“这批沙拉酱配方太老了,有健康风险,我们不再维护了,请改用新版。”
  • 原因
    1. 改名了:比如作者把包从 a 改名成了 @scope/a
    2. 有漏洞:旧版本被发现有安全隐患。
    3. 彻底烂尾:作者弃坑了,不再更新。

为什么很难修?

因为这是层层嵌套的。 你自己并没有在 package.json 里写 glob,是 A 依赖了 B,B 依赖了 C,C 依赖了 glob。 要想消除警告,你必须升级 A,期待 A 的新版里升级了 B,B 的新版里升级了 C……如果 A 的作者很懒没升级,你就卡住了。

你的日志分析

你的日志里有很多 rimraf@2.xglob@7.x。这两个是 Node 界著名的“钉子户”。虽然现在都出到 rimraf 6glob 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。
  • 解决办法
    1. 升级插件:去看 eslint-plugin-react-hooks 有没有发布支持 v9 的新版(通常是 5.1.0 以上)。

      pnpm add -D eslint-plugin-react-hooks@latest
    2. 如果插件还没适配:你就只能暂时降级 ESLint 到 v8,或者等待插件作者更新。


检测这两个问题

pnpm install 时会显示

// 检查有哪些“烂包” (Outdated)
pnpm outdated -r
# -r 表示 recursive(递归检查所有子项目)
# 个命令会列出你所有**直接依赖**的版本健康度。

// 查谁在使用废弃包 (Why)
pnpm why glob -r

// 查安全漏洞 (Audit)
pnpm audit

🛠️ 总结与实战建议

对于这两种问题,处理优先级如下:

  1. Peer Dependencies (红色/✕)必须解决

    • 这直接关系到代码能不能跑。版本不匹配可能导致插件无法启动、报错或功能缺失。
    • 动作:要么升级插件适配宿主,要么调整宿主适配插件。
  2. 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
创建于 2025/1/1 更新于 2026/5/27