Skip to content

npm 类和 pnpm 类查找差异

使用 npm 类的包管理器和使用 pnpm 类的包管理器,所下载的依赖存放的位置是不同的。因此需要分别配置相关查找算法。

npm 类

npm 类的包管理器,具有扁平化的特性:将所有依赖都直接安装在项目根目录下的 node_modules 目录中,当出现同一个依赖的不同版本时,只会依赖提升遇到的第一个版本,而后续的版本会被安装在对应依赖内的 node_modules 目录中。

因此,我们设计了一种冒泡查找的算法,从当前目录下的 node_modules 目录开始查找依赖的 package.json 文件,如果内部没有找到,则向上一级目录查找,直到根依赖目录。

这样就能准确地在扁平化和依赖提升特性下,找到各个依赖真正依赖的位置。

pnpm 类

pnpm 类的包管理器,从磁盘硬连接到项目根目录下的 node_modules/.pnpm 目录中,之后再将依赖软连接到项目根目录下的 node_modules 目录中。

因此,我们格外设计了一种软连接查找的算法,从当前目录下的 node_modules 目录开始查找依赖,并直接通过 fs.readlinkSync 方法获取软连接的真实路径,从而拿到其对应的 package.json,如果内部没有找到,则向上一级目录查找,直到根依赖目录。

这样直接利用软连接的特性,就能找到各个依赖真正依赖的位置。