标准答案

  1. npm 现在支持 lockfile、workspace 和较成熟的默认生态,node_modules 布局相对宽松。
  2. pnpm 使用内容寻址存储和符号链接,多个项目可复用同一份包内容,安装更节省磁盘。
  3. pnpm 的依赖结构更严格,项目不能随意访问没有声明的间接依赖,更容易暴露幽灵依赖。
  4. Yarn 有不同版本路线,经典 Yarn 和 Yarn Berry 在 node_modules、PnP、workspace 等方面差异很大。
  5. 团队选型要看现有项目、CI 缓存、Monorepo、兼容性、锁文件稳定性和成员熟悉度。

题目解析

包管理器差异最终会落到团队稳定性上:安装是否可复现、CI 是否好缓存、Monorepo 是否好协作、依赖声明是否严格。

pnpm 的严格依赖结构会让“没写在 package.json 但刚好能 require 到”的问题暴露出来。短期看是迁移成本,长期看能减少线上或 CI 环境才出现的依赖缺失。

Yarn 需要区分经典版本和 Berry/PnP。面试里不要只说 yarn 快,要说明不同版本的 node_modules 策略、生态兼容和团队已有工具链会影响选择。

代码示例

workspace 协议可以明确依赖当前工作区内的包。

JSON
{
  "dependencies": {
    "@acme/ui": "workspace:*"
  }
}

常见误区

  • 团队里 npm、pnpm、yarn 混用,导致 lockfile 和 node_modules 状态不一致。
  • 依赖没有声明在 package.json,却因为扁平化安装偶然能用。
  • 迁移 pnpm 时不检查旧项目的幽灵依赖和 postinstall 脚本。

作者信息