就比如我项目原来是npm的,然后安装了一堆依赖,此时nodemodules底下会有express依赖
此时我换成了pnpm安装,然后他会生成一个.pnpm目录,这时候他也会有express依赖,只不过是软硬连接,这时候我如果找express依赖的话,找的是哪个呢
你指的是幽灵依赖 —— 你没直接安装它、而是你安装的某个依赖的依赖这种吗?
如果是的话,那你在项目里 import 进来的是 npm 安装的那个版本。
P.S. 混用包管理工具是大忌,你这就是给自己埋雷呢……
幽灵依赖 pnpm 你压根就导入不进来,只能是 npm 的那个;显式依赖哪个后安装的就是哪个,pnpm 在后那硬链接就覆盖 npm 的了(毕竟是硬链接,具体表现可能还跟操作系统和文件系统有关,macOS 下是覆盖了,手头没 Windows 不太确定)。
就问题而言,会使用 pnpm 安装的 express。但其它依赖需要分依赖来源讨论。
比如项目依赖了 x,先 npm install x,再 pnpm install。这时 pnpm 会重建 node_modules 目录,把项目相关依赖都重新链接到 .pnpm 下的依赖文件夹。由于 npm install 时会提升依赖,所以 npm 安装 x 时提升的依赖如 y 你依旧能访问到。也就是说,x 是 pnpm 安装的 x,但 y 是 npm 安装的 y。
./node_modules/ .pnpm/ x -> link to .pnpm/x y -> npm installed
混用依赖管理器是不好的实践。如果涉及在多个项目使用不同的管理器,可以尝试用 @antfu/ni 或 corepack。