如何把 package.json 所有依赖更新到最新版本
用 npm-check-updates:npx npm-check-updates -u 更新 package.json 版本号到最新,再 npm install 安装。跨大版本升级可能破坏兼容性,务必分批升级+跑测试。附 npm update 与 ncu 的区别。
一句话回答:用 npm-check-updates 工具:npx npm-check-updates -u 把 package.json 里所有依赖的版本号改成最新(包括跨大版本),然后 npm install 实际安装。内置的 npm update 只能在 semver 范围内升(^1.2.3 最多升到 1.x 最新),能否跨主版本取决于原范围(如 *、>=1.0.0 可以跨主版本)。要突破原范围,需要修改声明。
标准流程
npx npm-check-updates # 先 dry-run:列出哪些包有新版本(不改文件)
npx npm-check-updates -u # 确认后升级 package.json
npm install # 安装新版本并更新 lock
npm test # 跑测试验证没炸
npx 会按需获取并执行包代码,请核对包名、来源及版本,团队可固定经过审核的版本。这里必须使用 npx npm-check-updates;不要写成 npx ncu,后者可能下载同名的其他包。仅在已明确安装 npm-check-updates 并确认命令来源后,才使用它提供的 ncu 简写。默认目标是 npm latest dist-tag,不等于数值最大的所有预发布版本。
ncu 实用参数
npx npm-check-updates --target minor -u # 只升到最新次版本(保守)
npx npm-check-updates --target patch -u # 只升补丁(仍需测试)
npx npm-check-updates -u react vue # 只升指定包
npx npm-check-updates -x webpack # 排除某个包
npx npm-check-updates --interactive # 逐个确认(推荐大升级时用)
稳妥的升级策略
- 分批升:先 patch(
--target patch)→ 再 minor → 最后 major 逐个来 - major 单独审:大版本必看 CHANGELOG 的 Breaking Changes(React 18→19、ESLint 8→9 这种都要改代码)
- 升级后必须:跑测试 + 构建 + 手动过一遍核心流程
- 一次别升太多:出问题时分批提交便于二分定位
npm update 与 ncu 的区别
| npm update | ncu -u | |
|---|---|---|
| 升补丁/次版本(范围内) | ✅ | ✅ |
| 跨主版本升级 | 取决于原 semver 范围 | 默认可改写到 latest,需审兼容性 |
| 修改 package.json | 默认不更新直接依赖范围;--save 可更新 |
-u 修改范围,安装需另执行 |
| 风险 | 范围内也可能回归 | 跨主版本及运行时要求变化需重点检查 |
日常维护跑 npm outdated 看落后情况,npm update 做范围内升级;定期(如每季度)用 ncu 做大版本跟进。
常见问题(FAQ)
Q:升级后项目起不来了怎么办?
A:升级前先保存并审核当前工作状态,记录可恢复的提交。失败后核对差异,将依赖声明与锁文件一起恢复到该明确基线,再按锁文件安装(例如 npm ci);不要覆盖无关的未提交修改。之后用 npx npm-check-updates --interactive 分批升级。
Q:peerDependencies 冲突报错?
A:新版依赖对宿主要求变了(如插件要求 eslint>=9 而你是 8)。按报错提示升级宿主包,或暂缓升级该插件。不要默认用 --legacy-peer-deps 掩盖约束冲突;同时核对 Node/npm 的 engines 要求和库的迁移说明。
Q:monorepo 里怎么用?
A:npm workspaces 项目用 npx npm-check-updates -u --workspaces 处理工作区包;如需连根 package.json 一起更新,按工具文档加 --root,并先预览范围;或逐包执行保持各自节奏。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。