乐闻世界logo
搜索文章和话题

npm 7+ 有哪些新功能?它们如何提升包管理?

2月17日 23:29

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" } }

目录结构

shell
my-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 使用更智能的依赖解析算法,减少重复安装。

依赖提升

shell
node_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 提供更清晰、更简洁的输出格式。

示例

shell
added 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 命令,显示项目的资金来源信息。

使用

bash
npm fund

输出示例

shell
my-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 提供更详细的错误信息和更好的错误恢复机制。

错误信息示例

shell
npm 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 开发的理想选择。

标签:NPM