pnpm 为什么分析依赖时显示的包和实际 node_modules 不一样?

Zz兰兰 阅读 60

我用 pnpm 装了个项目,执行 pnpm why lodash 显示好几个依赖都用了 lodash,但去 node_modules 里却只看到一个 .pnpm 目录,根本找不到直接的 lodash 文件夹,这到底咋回事?

是不是 pnpm 的依赖结构和 npm/yarn 不一样?我之前用 yarn 的时候 yarn why 的结果和 node_modules 结构基本能对上,现在完全懵了。

我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
闲人俊瑶
pnpm 的依赖管理方式确实和 npm/yarn 不太一样,这正是你困惑的根源。具体来说,pnpm 采用了一种叫 store-based 的方案来优化磁盘空间和安装速度。

首先,当你用 pnpm 安装依赖时,所有包实际上都被存放在全局的一个存储目录里(一般在用户主目录下的 .pnpm-store)。然后通过符号链接的方式把这些包挂载到项目内的 node_modules 目录中。

举个例子,假设你要找 lodash,它并不会像 npm 那样直接存在于 node_modules/lodash 目录下,而是通过符号链接指向全局存储位置。这就是为什么你在 node_modules 只看到 .pnpm 目录的原因。

要查看实际的 lodash 版本,你可以运行以下命令:

ls -l $(find node_modules -name lodash)


这段命令会列出所有的 lodash 符号链接,并显示它们指向的真正位置。

另外,如果你想要直接查看全局存储目录的位置,可以用这个命令:

pnpm store path


进入这个目录后,你会看到所有被安装过的包版本。虽然这种方式看起来复杂了点,但它的优点在于能极大节省磁盘空间,避免重复安装相同版本的包。

说实话,我刚接触 pnpm 的时候也有点不适应这种结构,但用了段时间发现确实挺香的,特别是对大型项目来说。不过刚开始可能会需要一点时间去适应这种新的组织方式。
点赞
2026-03-31 13:20
百里东慧
你这个问题是因为 pnpm 用了特殊的依赖存储方式。pnpm 把所有包都存到 .pnpm 目录下,然后通过符号链接来管理 node_modules。要是想看实际安装的 lodash,去 .pnpm 目录下找 .pnpm/lodash@版本号/node_modules/lodash 就行了,别按老套路在顶层 node_modules 找。
点赞
2026-03-27 21:29