你让 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 → 原生 fetch、moment → dayjs / date-fns),AI 还是先想到老的。
如何判断:搜 <旧库名> alternative 2026 或 <旧库名> deprecated,如果 reddit / GitHub discussion 第一页全是迁移帖,就是这种情况。
4. 包名相似导致误推
request 早在 2020 年就被彻底 deprecated,但 AI 还在推;crypto 是 Node 内置但 AI 推 crypto-js;uuid 包(截至 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+ 有原生 fetch、structuredClone、test runner;现代浏览器有 crypto.randomUUID()。AI 仍可能给你装 node-fetch、uuid、lodash.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+) / undici | request 自 2020 起 deprecated |
moment | date-fns v4 / dayjs / Temporal | moment 自 2020 起进入维护模式 |
node-fetch | 原生 fetch | 全局 fetch 在 Node 18+ 已稳定 |
lodash 整包 | lodash-es 按需 / 原生 ES | tree-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/react | enzyme 停更,无 React 18/19 adapter |
tslint | eslint + @typescript-eslint | tslint 自 2019 起 deprecated |
node-sass | sass (Dart Sass) | node-sass 已 deprecated |
formik | react-hook-form | formik 停更,维护者本人指向 RHF |
关于 Temporal:该 API 已在 2026 年 3 月进入 TC39 Stage 4,并在 Chrome 144+、Firefox 139+ 原生提供(Node v24 里在 flag 之后),但广泛的 runtime 支持还没到位。今天的生产环境用 date-fns 或 dayjs;只有当你确实想用这个新标准时,才配上 polyfill 去碰 Temporal。
Step 5:把”必须查 registry”写进 AI 的常驻指令
在 CLAUDE.md / .cursorrules / AGENTS.md 里加一条 hard rule:
推荐任何第三方依赖前,必须:
- 检查 npm/PyPI 上的最后发布日期(要求 ≤ 12 个月)
- 检查 package.json 的 deprecated 字段
- 如果没有联网工具,明确告诉用户"无法验证现状",不要凭训练记忆给名字
- 优先用 runtime 内置能力(Node fetch / crypto.randomUUID 等)
怎么确认已经修好
换包或升级之后,验证一下,别想当然:
npm view <new-pkg> deprecated无输出(没被 deprecated)。npm ls <old-pkg>显示旧包已从依赖树中消失(没有间接依赖仍在拉它)。npm install跑完,那个包不再打印 deprecation 警告。npm test(或你的构建)在新 API 上通过。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=high和npx depcheck,拦截无人维护的包 - 季度跑一次
npx npm-check-updates -u+ 测试套件,主动淘汰老依赖 - 优先用 runtime 内置(原生 fetch、crypto.randomUUID、structuredClone),少装一个就少一个隐患
- 关键依赖在
package.json里精确 pin(不带^),升级走 Renovate / Dependabot PR 而不是 AI 自由发挥
相关阅读
外部参考: