六维教程

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.0package.json 中是 ^18.2.0
  • Wanted18.3.0(主版本号 18 不变,次版本可以升)
  • Latest19.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.jsonpackage-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 会做三件事:

  1. node_modules 中删除包
  2. package.json 中移除对应记录
  3. 更新 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 updatenpm 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_modulesnpm install,能自动清理旧包吗?

能,因为 npm install 完全依据 package.jsonpackage-lock.json 重建 node_modules,不会残留任何旧文件。这也是为什么 rm -rf node_modules && npm install 能解决很多疑难问题。

Q:一个包既在 dependencies 又在 devDependencies 里,卸载时怎么区分?

npm uninstall 卸载时,NPM 会从它所在的位置移除。如果两个地方都有,它会同时移除两处。一般这种情况不会出现,建议保持单一来源。

上一篇
NPM create命令
下一篇
Markdown 列表