1. 包管理器

1.1. npm

优点:

  1. Node.js 默认包管理器,使用最广泛,拥有强大的额社区支持

  2. 最早的包管理器,简单易上手,对初学者友好

  3. package-lock.json 保证依赖版本一致性

缺点:

安装速度较慢,占用空间大

1.2. yarn

优点:

  • 采用扁平化优先 + 符号链接(符号链接是一个特殊的文件,它包含对另一个文件或目录的引用路径)的组合策略

  • 相同版本的包会被提升并复用

  • 不同版本通过符号链接保持正确的引用关系

缺点:

  • 仍然存在幽灵依赖问题: 尽管 Yarn 已经在扁平化和依赖管理上做了优化,但在一些复杂的项目中仍然会出现幽灵依赖问题。所谓幽灵依赖,指的是某个包在项目中使用但并未在 package.json 中声明,可能是通过其他依赖的间接依赖引入。这种隐式依赖会导致项目依赖关系难以维护,如果间接依赖被移除,可能会导致项目出错。

  • 某些场景下的依赖解析较慢:Yarn 的依赖解析虽然比传统 npm 更快,但在依赖结构复杂、依赖版本冲突较多的情况下,解析和处理依赖关系可能会变慢。尤其在 monorepo 中,Yarn 需要处理多个包之间的依赖关系,可能出现解析速度不如 pnpm 的情况

1.3. pnpm

优点:

  • 显著节省磁盘空间

  • 安装速度快

  • 更严格的依赖管理

  • pnpm-lock.yaml 确保依赖版本一致

缺点:

  • 不兼容一些使用传统 node_modules 结构的工具和插件:

pnpm 中,每个依赖都有自己的隔离路径,某些工具、插件或构建系统可能会假设 node_modules 目录是扁平的,这可能导致兼容性问题。

  • 与本地开发和测试环境的潜在不兼容:

npm install pnpm -g
# 查看当前源
pnpm config get registry
# 切换到淘宝npm镜像源
pnpm config set registry https://registry.npmmirror.com/
# 还原到默认的npm源
pnpm config set registry https://registry.npmjs.org