返回文章列表

文章

npm、yarn和pnpm的区别

它们都是包管理器

目录
  1. 以下从安装与版本、依赖管理方式、性能与缓存、磁盘占用、工作区(Monorepo)支持、CLI 特性及使用场景等维度,对 npm、Yarn 和 pnpm 进行详细对比。
  2. 一、安装与版本管理
  3. 二、依赖安装与 node_modules 结构
  4. 三、性能与缓存
  5. 四、Monorepo 与工作区(Workspaces)
  6. 五、常用 CLI 对比
  7. 六、使用场景建议
  8. 📎 参考文章

以下从安装与版本、依赖管理方式、性能与缓存、磁盘占用、工作区(Monorepo)支持、CLI 特性及使用场景等维度,对 npm、Yarn 和 pnpm 进行详细对比。#

一、安装与版本管理#

  • npm
    • 随 Node.js 一起内置,自 Node.js 0.6 版本起就默认提供,无需额外安装。
    • 主版本:v6 → v7 → v8 → v9(不断引入新特性,如 workspaces、peerDependencies 自动安装等)。
    • 锁文件:package-lock.json,保证团队或 CI 安装一致性。
  • Yarn
    • Facebook 开发,需要通过 npm install -g yarn 安装。
    • 主分支:
      • Classic(v1.x):首次引入离线缓存与并行安装;
      • Berry(v2+):重写架构,支持 Plug’n’Play(PnP)、Fragments 等。
    • 锁文件:yarn.lock,格式在 v2+ 也演进为更紧凑的 HOP 格式。
  • pnpm
    • 需要通过 npm install -g pnpm 安装。
    • 主版本:v1 → v2 → v3…,每一代都在增强 monorepo 与存储策略。
    • 锁文件:pnpm-lock.yaml,与 pnpm 版本严格绑定,确保一致性。

二、依赖安装与 node_modules 结构#

特性npm / Yarn(v1)Yarn Berry (v2+)pnpm
依赖扁平化将共享依赖扁平化并 hoist 到顶层PnP:**不**生成 node_modules内容可寻址存储 + 硬链接
node_modules传统树状 & 扁平化(脱 hoist 可控)无 node_modules(或可选生成)依赖精确可见,避免“幽灵依赖”
磁盘占用较大(多项目重复拷贝)v2+ 不占用(仅元数据)极小(全局 Store + 硬链接)
  • npm/Yarn v1 使用扁平化策略(hoisting),有时会隐藏未声明的依赖。
  • Yarn v2+ 采用 PnP,跳过 node_modules,通过索引定位模块,安装几乎“零时延”。
  • pnpm 引入全局内容可寻址存储(~/.pnpm-store),各项目内 node_modules 文件夹仅为硬链接,既保留传统目录结构,又避免重复拷贝。

三、性能与缓存#

场景npm (v7+)Yarn v1Yarn v2+ (Berry)pnpm
冷启动安装并行安装,速度提升明显并行+离线缓存,中速即刻完成(无需物理拷贝)并行+全局缓存,冷启动也很快
热启动(已缓存)复用 `~/.npm` 缓存,需校验元数据离线镜像可直接取用完全无需下载全局 Store 硬链接即时可用
脚本执行每包执行 lifecycle 脚本同 npm可跳过脚本(更快)与 npm 类似,但按需执行

四、Monorepo 与工作区(Workspaces)#

特性npm WorkspacesYarn Workspacespnpm Workspaces
引入版本npm v7Yarn v1pnpm v2
配置方式`package.json` 中 `workspaces` 字段同 npm顶层 `pnpm-workspace.yaml`
依赖 hoist 控制无细粒度控制`noHoist` 白名单`public-hoist-pattern`
跨包引用错误检测运行时报错编译前可检测(v2+)开发期即报错(严格)
链接机制符号链接 (symlink)符号链接 (symlink)硬链接+符号链接
  • pnpm 在 Monorepo 中最“严格”,任何包间引用都必须在依赖中申明,否则安装或运行时即会失败,帮助团队更早发现问题。

五、常用 CLI 对比#

操作npmYarn (v1/v2+)pnpm
安装全部依赖`npm install``yarn``pnpm install`
添加依赖`npm install pkg``yarn add pkg``pnpm add pkg`
删除依赖`npm uninstall pkg``yarn remove pkg``pnpm remove pkg`
运行脚本`npm run build``yarn build``pnpm run build`
全局安装`npm install -g pkg``yarn global add pkg``pnpm add -g pkg`
查看依赖缘由无内建`yarn why pkg` (v1)`pnpm why pkg`
交互式升级`npm update``yarn upgrade-interactive``pnpm up -i`

六、使用场景建议#

  • 倾向零配置、广泛兼容 → 选 npm
    • Node.js 自带,无需额外安装;生态工具(如 Create React App)默认支持。
  • 关注离线安装、成熟工作区生态 → 选 Yarn v1v2+
    • 需要可靠的离线镜像、交互式升级;愿意为 Plug’n’Play 适配额外工具配置。
  • 追求最高性能、最小磁盘占用、严格依赖管理 → 选 pnpm
    • 多项目共享依赖、CI 构建并行化:命中缓存速度极快,且能即刻发现未声明依赖。

无论选择哪一种,它们都在积极维护并支持现代前端/全栈开发工作流;关键在于根据团队规模、CI 策略、磁盘&网络环境、Monorepo 需求等因素来权衡。

📎 参考文章#