AI 建议了过时依赖:快速修复

AI 推荐了一个已停更的 npm/PyPI 包。用 npm view 三秒判定、换成现代替代、再让它不再复发。

你让 Claude Code、Cursor 或 Codex “加个库做 X”,它信心满满给了一个名字,等你 npm install 完才发现:GitHub 仓库三年没动、issues 堆了 200 个、最后一个 release 是 2021。AI 不是在骗你,而是它的训练快照里这个库还活着,默认情况下它也不会主动去查 registry 现状,所以只能凭记忆回答。

最快修复:安装任何 AI 推荐的包之前,先跑一行 npm view <pkg> time.modified deprecated。如果最后一次发布超过一年,或者 deprecated 字段返回了一个字符串,那它就是过时的。到下面的对照表查现代替代,或者开着 web 搜索让 AI 重新查一遍。下面逐项展开。

你属于哪一种

这个问题有五种不同成因。先在表里对上你的症状,再跳到对应的修复。

你看到的症状可能成因跳转
推荐的包最后一次 release 是好几年前训练截止(凭记忆,没查)成因 1 / Step 1
回答里没有 npm 链接、下载量、release 日期没让它查 registry成因 2 / Step 2
AI 坚持推”经典”库而不是已知的现代 fork旧博客被过度训练成因 3 / Step 4
import 能跑但 API 跟装上的版本对不上同名包大版本断代成因 4 / Step 3
它装了个 polyfill,可这能力 runtime 已经内置能力被并入平台成因 5 / Step 4

常见原因

按命中率从高到低排序。

1. 模型训练数据有截止日期

每个模型都有 knowledge cutoff,cutoff 之后的 npm release、deprecation、所有权变更它都看不见。Claude、GPT、Gemini 给的”主流推荐”经常是 1-2 年前的主流,现在已经被 fork 取代了。典型案例:

你:帮我加个 React 拖拽库
AI:用 react-beautiful-dnd
现实:Atlassian 已于 2025-08-18 archive 仓库,npm 包也被 deprecated
      (install 时会打印 console 警告)。社区迁移到 @dnd-kit;
      Atlassian 自己的接班产品是 Pragmatic drag-and-drop
      (@atlaskit/pragmatic-drag-and-drop)。

如何判断:把 AI 给的包名贴到 https://www.npmjs.com/package/<name>,看 “Last publish” 是否超过 12 个月(截至 2026 年 6 月,这是红线),README 顶部是否有 “DEPRECATED / archived” 横幅。维护者一旦把包标记为停更,npm 页面也会在安装命令上方弹出一条黄色 deprecation 横幅。

2. 没让它先查 registry

默认 prompt “推荐一个库做 X” 会触发记忆检索,而不是工具调用。Cursor 和 Claude Code 都能联网搜索,但除非开启了 web 权限或你明确要求,它不会主动用(Cursor 里用 @Web 工具,Claude Code 里要让 WebSearch/WebFetch 工具在当前会话可用)。没有工具的裸 LLM 则是完全离线推理。

如何判断:看 AI 的回答里有没有 npm 页面链接、最近一次 release 日期、weekly downloads。三样都没有就是凭记忆。

3. 过时的 Stack Overflow / 博客答案被反复训练

热门库被旧博客反复提到,权重比新 fork 高。即使新 fork 已经是事实标准(如 node-fetch → 原生 fetchmomentdayjs / date-fns),AI 还是先想到老的。

如何判断:搜 <旧库名> alternative 2026<旧库名> deprecated,如果 reddit / GitHub discussion 第一页全是迁移帖,就是这种情况。

4. 包名相似导致误推

request 早在 2020 年就被彻底 deprecated,但 AI 还在推;crypto 是 Node 内置但 AI 推 crypto-jsuuid 包(截至 2026 年 6 月当前主版本已到 14.x)好几个大版本前就改了 API,但 AI 还在写 v3 时代的 uuid.v4() import 写法,跟现在对不上。同名包的版本断代是高频坑。

如何判断:让 AI 同时给出 import 语句和 package.json 版本号,如果它锁的是 ^1.x^2.x 而该包当前主版本已经领先好几个大版本,几乎一定有 breaking change。用 npm view <pkg> version 看 latest,对比它写的版本。

5. 推荐了已经被并入主分支 / 内置的能力

Node 18+ 有原生 fetchstructuredClone、test runner;现代浏览器有 crypto.randomUUID()。AI 仍可能给你装 node-fetchuuidlodash.clonedeep,多一份依赖、多一次安全审计。

如何判断:runtime 升级后 review AI 加的依赖,问”这个能力 Node / 浏览器 / 框架原生有吗?“

最短修复路径

按收益从高到低。前 3 步通常就把”AI 推荐烂库”的问题解决掉。

Step 1:用 npm view 三秒判定是否过时

拿到 AI 推荐的包名先跑:

npm view react-beautiful-dnd time.modified
npm view react-beautiful-dnd deprecated
npm view react-beautiful-dnd maintainers
  • time.modified 是 package 文档上的最后修改时间,超过 12 个月就警惕
  • deprecated 有内容代表官方挂了停更标记(无输出代表没被 deprecated)
  • maintainers 数量降到 1 且名字是个人 GitHub,长期风险高

想一次性查整棵依赖树而不是一个一个查?跑 npx npm-deprecated-check,一次扫完 lockfile 里所有依赖的 deprecation 标记。

Python 用 pip index versions <pkg> 看已发布版本,或直接看 PyPI 页面(https://pypi.org/project/<pkg>/)的 “Last release” 日期。

Step 2:让 AI 重新查、附上证据

把 prompt 改成强制工具调用 / 强制引用:

我要一个 React 拖拽库。请:
1. 列出 npm 上最近 12 个月内仍有 release 的 3 个候选
2. 每个给出:weekly downloads、最近 release 日期、GitHub stars、最近一次 issue 活动
3. 不要推荐已经 archived 或 deprecated 的包
如果你无法访问 npm,明确说"我无法验证,请人工核对",不要凭记忆给答案

Claude Code 里加 web 搜索权限,Cursor 里用 @Web 触发联网;裸 LLM 没工具就要求它显式说”无法验证”。

Step 3:用 npm-check-updates 修掉 AI 写死的旧版本号

AI 经常把版本号也写死成训练时的版本。一次性扫描升级:

npx npm-check-updates -u           # 把 package.json 全部升到最新
npm install
npm test

如果 minor / patch 即可解决就锁到 ~;major 升级要逐个看 changelog。Python 用 pip list --outdated + pip-review --auto

Step 4:常见”AI 偏爱但已过时”对照表

直接替换,省得每次都查:

AI 常推(过时)现代替代(2026 年 6 月)状态说明
request原生 fetch (Node 18+) / undicirequest 自 2020 起 deprecated
momentdate-fns v4 / dayjs / Temporalmoment 自 2020 起进入维护模式
node-fetch原生 fetch全局 fetch 在 Node 18+ 已稳定
lodash 整包lodash-es 按需 / 原生 EStree-shaking 很关键
uuid v3 写法crypto.randomUUID() (Node 19+/LTS 20+/浏览器)uuid 包本身仍在维护(14.x),过时的只是 v3 写法
react-beautiful-dnd@dnd-kit/core,或 @atlaskit/pragmatic-drag-and-drop,或 fork @hello-pangea/dnd仓库 2025-08-18 archive,npm 已 deprecated
enzyme@testing-library/reactenzyme 停更,无 React 18/19 adapter
tslinteslint + @typescript-eslinttslint 自 2019 起 deprecated
node-sasssass (Dart Sass)node-sass 已 deprecated
formikreact-hook-formformik 停更,维护者本人指向 RHF

关于 Temporal:该 API 已在 2026 年 3 月进入 TC39 Stage 4,并在 Chrome 144+、Firefox 139+ 原生提供(Node v24 里在 flag 之后),但广泛的 runtime 支持还没到位。今天的生产环境用 date-fnsdayjs;只有当你确实想用这个新标准时,才配上 polyfill 去碰 Temporal。

Step 5:把”必须查 registry”写进 AI 的常驻指令

CLAUDE.md / .cursorrules / AGENTS.md 里加一条 hard rule:

推荐任何第三方依赖前,必须:
- 检查 npm/PyPI 上的最后发布日期(要求 ≤ 12 个月)
- 检查 package.json 的 deprecated 字段
- 如果没有联网工具,明确告诉用户"无法验证现状",不要凭训练记忆给名字
- 优先用 runtime 内置能力(Node fetch / crypto.randomUUID 等)

怎么确认已经修好

换包或升级之后,验证一下,别想当然:

  1. npm view <new-pkg> deprecated 无输出(没被 deprecated)。
  2. npm ls <old-pkg> 显示旧包已从依赖树中消失(没有间接依赖仍在拉它)。
  3. npm install 跑完,那个包不再打印 deprecation 警告。
  4. npm test(或你的构建)在新 API 上通过。
  5. npm audit --audit-level=high 不再报跟被删包相关的 high/critical 漏洞。

常见问答

为什么我纠正过之后,AI 还是反复推同一个停更的库? 在同一段对话里它通常会接受纠正,但开个新会话又会从训练记忆开始。真正持久的办法是 Step 5 里那条常驻指令(CLAUDE.md / .cursorrules / AGENTS.md),它每个会话都会被加载。

一个一年没提交的包就一定是坏的吗? 不一定。小而”完成态”的工具(比如 leftpad 那类单一职责的库)可以既稳定又完整。把超过 12 个月当作一个提醒,去查三件事:是否有明确的 deprecated 标记、有没有未修的安全公告(npm audit)、这能力是不是已经成了 runtime 内置。坏的组合是”又老、又 deprecated、又有替代”,光是年纪大不算。

怎么知道 AI 真的查了 npm 而不是在猜? 要求它对每个候选都给出最近 release 日期和 weekly downloads,并附上 npm URL。如果这些数字缺失,或者跟 https://www.npmjs.com/package/<name> 上一对明显不符,那就是凭记忆。Cursor 里 @Web 强制联网查;Claude Code 里要保证 web 工具在当前会话已启用。

uuid 包都到 v14 了还在维护,为什么它还在对照表里? 包没问题。过时的是 AI 常给的 v3 时代写法(const uuid = require('uuid'); uuid.v4()),它在现代大版本上会挂。新代码跑在 Node 19+ / LTS 20+ 上,通常根本不需要这个依赖:crypto.randomUUID() 已经内置。

这只适用于 npm 吗? 不是。同样的模式也出现在 PyPI(pip index versions <pkg>,看 “Last release”)、Cargo(cargo search、crates.io 状态)和 Go modules 上。判定思路完全一致:信 AI 的记忆之前,先从 registry 确认最新版本和维护状态。

预防建议

  • 所有 AI 建议的依赖在 install 之前,先 npm view <pkg> time.modified deprecated 看一眼
  • CLAUDE.md / .cursorrules 里强制”推荐依赖必须附最近 release 日期”
  • 在 CI 加 npm audit --audit-level=highnpx depcheck,拦截无人维护的包
  • 季度跑一次 npx npm-check-updates -u + 测试套件,主动淘汰老依赖
  • 优先用 runtime 内置(原生 fetch、crypto.randomUUID、structuredClone),少装一个就少一个隐患
  • 关键依赖在 package.json 里精确 pin(不带 ^),升级走 Renovate / Dependabot PR 而不是 AI 自由发挥

相关阅读

外部参考:

标签: #AI 编程 #排查 #排查