pnpm | 青训营笔记

77 阅读2分钟

前言

pnpm是一款速度快、节省磁盘空间的包管理器。自诞生以来,其下载量一路飙升,成为前端包管理器中一颗冉冉升起的新星。在青训营的项目实践中我们组采用了pnpm作为包管理工具,借此机会学习并整理了pnpm的使用 image.png

何以pnpm

npm和yarn管理的的全部依赖项都存放在扁平化的node.modules目录中统一管理,这样做的优点是不会产生过深的嵌套依赖关系。但是当两个包a和b分别依赖某一个包c的不同版本c1和c2,存放在node.modules中的c只能有一个版本,c1和c2哪一个被提升到node.modules目录取决于a和b两个包哪一个先被安装,因此产生了依赖结构的不确定性,这也是lock文件的诞生要解决的问题。

pnpm管理下的包的存储采用了基于内容寻址(content-addressable)的文件系统,存储在store文件夹中,文件名为其内容的哈希值,从而保证相同内容的文件只会存储一份,在安装依赖项时能够重复使用已有的内容,避免冗余的安装。

image.png

此外,安装依赖后的信息提示能够看到还有一个 virtual store 指向 node.module/.pnpm.。.pnpm为虚拟磁盘目录,它同样以扁平化的方式存放着所有包

image.png

而与.pnpm同级的还有安装的包,它们后面带一个箭头符号,表明它们是一个软连接,可以理解为路径信息,指向.pnpm中对应的包文件夹下的node.modules中的对应文件,而这个文件和前面提到的store文件夹中的对应文件形成一个硬链接, 可以理解为都指向同一块数据内容。这么做的好处是能够确保每个包的上下文隔离。

还是官网的图比较直白,这里直接上图,结构一目了然:

image.png

使用pnpm

pnpm的使用并没有什么特殊之处,和npm和yarn类似

  • pnpm init :初始化项目
  • pnpm install 或简写 pnpm i :安装全部依赖
  • pnpm add <pkg> : 安装指定依赖,保存到devDependencies 配置项下;-D 参数 保存到 devDependencies 配置项下
  • pnpm update : 所有依赖更新到最新版本
  • pnpm remove <pkg> : 移除指定依赖