npm 7+ 引入了重大改进,包括并行安装、工作区支持和更好的依赖解析。了解这些新特性对于现代 JavaScript 开发至关重要。
npm 7 主要新特性
1. 并行安装
npm 7 改进了依赖安装算法,支持并行下载和安装包。
性能提升:
- 安装速度比 npm 6 快 2-3 倍
- 更好的网络资源利用
- 减少总体安装时间
配置并行度:
bash# 设置最大并行连接数 npm config set maxsockets 50 # 设置最大网络请求并发数 npm config set network-concurrency 16
2. 工作区(Workspaces)
npm 7 原生支持 monorepo 工作区,无需额外配置。
配置工作区:
json{ "name": "my-monorepo", "version": "1.0.0", "private": true, "workspaces": [ "packages/*" ], "scripts": { "install": "npm install -ws", "build": "npm run build -ws", "test": "npm test -ws" } }
目录结构:
shellmy-monorepo/ ├── package.json ├── packages/ │ ├── shared/ │ │ ├── package.json │ │ └── index.js │ ├── app/ │ │ ├── package.json │ │ └── index.js │ └── utils/ │ ├── package.json │ └── index.js
工作区命令:
bash# 在所有工作区中运行命令 npm run build -ws # 在特定工作区中运行命令 npm run build --workspace=packages/app # 安装依赖到特定工作区 npm install lodash --workspace=packages/app # 添加工作区依赖 npm install ../shared --workspace=packages/app
3. 改进的依赖解析
npm 7 使用更智能的依赖解析算法,减少重复安装。
依赖提升:
shellnode_modules/ ├── lodash/ # 提升到顶层 ├── package-a/ ├── package-b/ └── package-c/
配置解析策略:
bash# 禁用依赖提升 npm config set legacy-bundling true # 使用严格的 peer 依赖解析 npm config set strict-peer-deps true
4. package-lock.json v2
npm 7 引入了新的锁文件格式,提供更好的可读性和更详细的元数据。
新特性:
- 更清晰的 JSON 结构
- 包含包的完整性信息
- 支持工作区
- 更好的版本范围处理
示例:
json{ "name": "my-project", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "my-project", "version": "1.0.0", "dependencies": { "express": "^4.18.0" } }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-...", "dependencies": { "accepts": "~1.3.8" }, "engines": { "node": ">= 0.10.0" } } } }
5. npm exec 和 npx 改进
npm 7 改进了 npx 的实现,并引入了 npm exec 命令。
npm exec:
bash# 执行包中的二进制文件 npm exec create-react-app my-app # 等同于 npx npx create-react-app my-app # 传递参数 npm exec --package=eslint -- eslint src/
改进的 npx:
- 更快的包解析
- 更好的缓存机制
- 支持多个包
6. 自动安装 peer 依赖
npm 7 默认自动安装 peer 依赖,简化依赖管理。
行为变化:
bash# npm 6: 需要手动安装 peer 依赖 npm install <package> npm install <peer-dependency> # npm 7: 自动安装 peer 依赖 npm install <package>
配置:
bash# 禁用自动安装 peer 依赖 npm config set auto-install-peers false # 使用严格的 peer 依赖解析 npm config set strict-peer-deps true
7. 改进的输出格式
npm 7 提供更清晰、更简洁的输出格式。
示例:
shelladded 1423 packages, and audited 1424 packages in 32s 238 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
8. npm fund 命令
npm 7 引入了 npm fund 命令,显示项目的资金来源信息。
使用:
bashnpm fund
输出示例:
shellmy-project@1.0.0 ├── express@4.18.2 │ └── https://opencollective.com/express ├── lodash@4.17.21 │ └── https://opencollective.com/lodash └── webpack@5.0.0 └── https://github.com/sponsors/webpack
9. 支持 overrides
npm 8+ 支持 overrides 字段,强制使用特定版本的依赖。
配置 overrides:
json{ "overrides": { "vulnerable-package": "1.2.3", "package-a": { "package-b": "2.0.0" } } }
使用场景:
- 修复安全漏洞
- 解决版本冲突
- 强制使用特定版本
10. 改进的错误处理
npm 7 提供更详细的错误信息和更好的错误恢复机制。
错误信息示例:
shellnpm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: my-project@1.0.0 npm ERR! Found: react@18.0.0 npm ERR! node_modules/react npm ERR! react@"^18.0.0" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer react@"^16.0.0" from some-package@1.0.0 npm ERR! node_modules/some-package
npm 8 新特性
1. 改进的 workspaces
npm 8 改进了工作区功能,支持更复杂的 monorepo 结构。
2. npm diff 命令
npm 8 引入了 npm diff 命令,比较依赖版本差异。
bash# 比较当前安装与 package.json npm diff # 比较特定包 npm diff <package-name> # 比较两个版本 npm diff <package-name>@1.0.0 <package-name>@2.0.0
3. 改进的 npm query
npm 8 改进了 npm query 命令,支持更强大的依赖查询。
bash# 查找所有过期的包 npm query ":outdated" # 查找所有开发依赖 npm query ":dev" # 查找特定包的依赖 npm query "lodash > *"
4. 支持 .npmrc 的继承
npm 8 支持从父目录继承 .npmrc 配置。
npm 9 新特性
1. 改进的性能
npm 9 进一步优化了性能,安装速度更快。
2. 改进的安全性
npm 9 增强了安全功能,包括更好的完整性验证。
3. 改进的错误报告
npm 9 提供更清晰的错误信息和更好的故障排除指导。
迁移到 npm 7+
1. 升级 npm
bash# 使用 npm 自身升级 npm install -g npm@latest # 使用 nvm nvm install node --latest-npm # 使用 n n latest
2. 检查兼容性
bash# 检查项目依赖 npm ls # 检查 peer 依赖 npm ls --depth=0
3. 处理 peer 依赖
bash# 自动安装 peer 依赖 npm install # 手动解决冲突 npm install --force
4. 更新 package-lock.json
bash# 删除旧的锁文件 rm package-lock.json # 重新安装生成新锁文件 npm install
最佳实践
1. 使用工作区管理 monorepo
json{ "workspaces": [ "packages/*" ], "scripts": { "install": "npm install -ws", "build": "npm run build -ws", "test": "npm test -ws", "clean": "npm run clean -ws" } }
2. 使用 overrides 管理版本
json{ "overrides": { "vulnerable-package": "1.2.3" } }
3. 使用 npm ci 替代 npm install
bash# CI 环境使用 npm ci npm ci
4. 配置合理的并行度
bash# 根据网络环境调整 npm config set maxsockets 50 npm config set network-concurrency 16
5. 使用 npm fund 支持开源项目
bash# 查看项目资金来源 npm fund # 支持开源项目 npm fund <package-name>
常见问题
1. peer 依赖冲突
bash# 使用严格的 peer 依赖解析 npm config set strict-peer-deps true # 手动解决冲突 npm install --force
2. 工作区依赖问题
bash# 清理工作区缓存 npm cache clean --force # 重新安装 npm install -ws
3. 性能问题
bash# 检查配置 npm config list # 调整并行度 npm config set maxsockets 50 # 使用缓存 npm install --prefer-offline
npm 7+ 带来了显著的性能提升和功能改进,是现代 JavaScript 开发的理想选择。