pnpm 允许同一依赖的多个版本在同一项目中并存,每个版本作为独立的包条目存在于 .pnpm 虚拟存储中。当不同层级的依赖要求同一包的不同版本时,pnpm 会为每个版本创建单独的目录条目,通过符号链接分别指向对应的硬链接副本。由于硬链接指向的是 CAS 中按内容哈希区分的文件,不同版本之间不会相互覆盖。
pnpm 在依赖解析阶段会构建完整的依赖树,识别出所有需要的版本及其约束关系。若存在版本冲突(如包 A 要求 lodash@^4.17.0,包 B 要求 lodash@^4.18.0),pnpm 会尝试找到满足所有约束的最高兼容版本;若无法找到,则两个版本并存,各自安装到独立的目录中。这种策略确保了每个依赖都能在其声明的版本范围内正确解析,避免因版本强制统一而引入破坏性变更。
npm 和 Yarn Classic 的扁平化结构会将尽可能多的依赖提升到 node_modules 根目录,当多个包要求同一依赖的不兼容版本时,往往只能保留一个版本,可能导致其他包运行异常。pnpm 的非扁平结构天然支持多版本共存,每个包只能访问其显式声明的依赖版本,从根本上避免了版本冲突引发的隐蔽问题。