NPM 依赖维护
项目开发了一段时间,依赖包可能已经发布了新版本。有的修复了安全漏洞,有的加了新功能,有的甚至做了破坏性变更。
这时候就需要对依赖进行维护:看看装了哪些包、哪些能升级、怎么升级、不需要的怎么删掉。
查看依赖
查看已安装的包
# 查看当前项目的所有依赖(树形结构)
npm list
# 只看顶层依赖(不展开子依赖)
npm list --depth=0
# 查看某个特定包是否安装
npm list lodash
# 查看全局安装的包
npm list -g --depth=0
输出示例:
my-app@1.0.0 /path/to/my-app
├── axios@1.6.0
├── lodash@4.17.21
├── react@18.2.0
└── vite@4.5.0
--depth=0 让你只看自己直接安装的包,而不是被依赖树淹没,日常最常用。
查看包的具体信息
# 查看包在 registry 中的信息(版本、描述、依赖等)
npm view axios
# 只查看版本列表
npm view axios versions
# 查看最新版本
npm view axios version
npm view 会去 npm registry 拉取实时信息,适合查看某个包目前有哪些版本可选。
检查更新
npm outdated
这个命令会列出所有“可以升级”的包:
Package Current Wanted Latest Location
lodash 4.17.21 4.17.21 5.0.0 my-app
react 18.2.0 18.3.0 19.0.0 my-app
vite 4.5.0 4.5.3 5.0.0 my-app
三列版本的含义:
| 列 | 含义 |
|---|---|
| Current | 当前项目实际安装的版本 |
| Wanted | 符合 package.json 中版本范围约束的最新版本 |
| Latest | 该包在 npm registry 中的最新版本 |
举个例子:
react当前是18.2.0,package.json中是^18.2.0Wanted是18.3.0(主版本号 18 不变,次版本可以升)Latest是19.0.0(主版本号变了,^18.2.0不允许跨过去)
更新依赖
更新到 Wanted 版本(推荐)
# 更新所有包到 Wanted 版本
npm update
# 更新指定包
npm update lodash
npm update 只升到 Wanted 版本,不会跨越主版本号,安全性最高。
更新到指定版本
# 安装精确版本
npm install lodash@4.17.21
# 安装最新版本(跨主版本)
npm install react@latest
# 安装特定大版本的最新版
npm install react@18
用 npm install <package>@<version> 可以精确控制装什么版本,package.json 和 package-lock.json 会自动更新。
更新所有包到最新版(谨慎操作)
# 全局更新所有包到 latest(可能跨越主版本)
npx npm-check-updates -u
这不是 NPM 内置命令,需要先安装 npm-check-updates。它会直接修改 package.json 中的版本号到 latest,然后你执行 npm install 完成安装。
风险提示:跨主版本升级可能引入破坏性变更,建议在测试分支操作。
卸载依赖
# 卸载生产依赖
npm uninstall axios
# 卸载开发依赖
npm uninstall -D vitest
# 全局卸载
npm uninstall -g nodemon
npm uninstall 会做三件事:
- 从
node_modules中删除包 - 从
package.json中移除对应记录 - 更新
package-lock.json
无论是全局还是本地卸载,都只需要包名,不需要写版本号。
# ❌ 错误写法(会失败)
npm uninstall @anthropic-ai/claude-code@2.1.98
npm uninstall -g @anthropic-ai/claude-code@2.1.98
# ✅ 正确写法
npm uninstall @anthropic-ai/claude-code
npm uninstall -g @anthropic-ai/claude-code
如果你卸载的包被其他包依赖,NPM 会保留它。如果没有任何包依赖它,NPM 会把它从 node_modules 中移除。
想彻底清理项目中不再需要的包:
# 删除 node_modules 中所有未被 package.json 引用的包
npm prune
这个命令会扫描 node_modules,移除那些不在 package.json 中声明的包,通常用于清理残留。
实际工作流
| 场景 | 命令 | 说明 |
|---|---|---|
| 看装了哪些顶层包 | npm list --depth=0 |
快速浏览项目依赖 |
| 看某个包的信息 | npm view axios |
查看版本、文档、依赖等 |
| 检查哪些能升级 | npm outdated |
了解升级空间 |
| 安全升级到 Wanted | npm update |
只升补丁和次版本 |
| 升级指定包 | npm install react@18 |
精确控制版本 |
| 移除不需要的包 | npm uninstall lodash |
删除并更新 package.json |
| 清理残留包 | npm prune |
删除未被引用的包 |
| 查看全局包 | npm list -g --depth=0 |
看看系统装了哪些工具 |
新手常见问题
Q:npm update 和 npm install 有什么区别?
npm install |
npm update |
|
|---|---|---|
| 用途 | 安装新包或按 lock 恢复 | 升级已有包到更新版本 |
| 是否改变版本 | 按 specifier 决定 | 会升级到符合条件的更新版本 |
package-lock.json |
生成/更新 | 更新 |
Q:怎么看某个包当前安装的版本?
npm list lodash
# 输出:my-app@1.0.0 /path/to/my-app
# └── lodash@4.17.21
或者直接看 package-lock.json 中的记录。
Q:npm outdated 里的 Wanted 和 Latest 总是不一样,怎么办?
这是正常的。Wanted 是符合你 package.json 范围约束的安全版本,Latest 是可能跨主版本的“激进”更新。
- 日常工作:升到
Wanted - 有计划的大版本升级:手动装
Latest,但要在测试环境验证
Q:删了 node_modules 再 npm install,能自动清理旧包吗?
能,因为 npm install 完全依据 package.json 和 package-lock.json 重建 node_modules,不会残留任何旧文件。这也是为什么 rm -rf node_modules && npm install 能解决很多疑难问题。
Q:一个包既在 dependencies 又在 devDependencies 里,卸载时怎么区分?
用 npm uninstall 卸载时,NPM 会从它所在的位置移除。如果两个地方都有,它会同时移除两处。一般这种情况不会出现,建议保持单一来源。