pnpm 安装依赖后为什么有些包在 node_modules 里找不到?

东方熙炫 阅读 4

我最近从 yarn 切到 pnpm,执行 pnpm install 后发现一些依赖比如 lodash 在 node_modules 里直接搜不到,但项目又能正常运行。这是不是 pnpm 的硬链接机制导致的?

我试过删掉 node_modules 重装,也确认了 package.json 里有这些依赖,但就是看不到实际文件夹。难道要改什么配置才能让依赖显示出来吗?

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
开发者梓睿
哈哈,刚从 yarn/npm 切到 pnpm 都会遇到这个困惑,前端这块确实容易让人懵一下。

你猜得没错,就是 pnpm 的机制导致的,但不是"找不到",而是它换了个存法。

pnpm 跟 npm/yarn 不一样,它不会把所有依赖平铺在 node_modules 根目录下。你看到的 node_modules 结构是这样的:根目录只有你 package.json 里直接声明的依赖(而且是软链接),真正的包实体都藏在 node_modules/.pnpm 这个目录里。

所以你搜 lodash 搜不到,是因为它可能作为其他包的依赖被安装的,或者是被 hoist 规则影响了。去 node_modules/.pnpm 目录下搜,肯定都在里面。

项目能跑就说明没毛病,不用改啥配置。这是 pnpm 的特性,不是 bug。它这么干是为了解决 npm/yarn 的幽灵依赖问题,就是你没声明但能用的情况,pnpm 给强制隔离了。

如果你实在想看到所有依赖平铺出来,可以在项目根目录建个 .npmrc 文件,加上这行配置:

node-linker=hoisted


或者用这个:

shamefully-hoist=true


重装之后 node_modules 结构就跟 npm 差不多了。但说实话,不建议这么干,既然用了 pnpm 就接受它的设计哲学吧,严格依赖管理能少踩很多坑。
点赞
2026-03-02 02:03