前言
pnpm是一款速度快、节省磁盘空间的包管理器。自诞生以来,其下载量一路飙升,成为前端包管理器中一颗冉冉升起的新星。在青训营的项目实践中我们组采用了pnpm作为包管理工具,借此机会学习并整理了pnpm的使用
何以pnpm
npm和yarn管理的的全部依赖项都存放在扁平化的node.modules目录中统一管理,这样做的优点是不会产生过深的嵌套依赖关系。但是当两个包a和b分别依赖某一个包c的不同版本c1和c2,存放在node.modules中的c只能有一个版本,c1和c2哪一个被提升到node.modules目录取决于a和b两个包哪一个先被安装,因此产生了依赖结构的不确定性,这也是lock文件的诞生要解决的问题。
pnpm管理下的包的存储采用了基于内容寻址(content-addressable)的文件系统,存储在store文件夹中,文件名为其内容的哈希值,从而保证相同内容的文件只会存储一份,在安装依赖项时能够重复使用已有的内容,避免冗余的安装。
此外,安装依赖后的信息提示能够看到还有一个 virtual store 指向 node.module/.pnpm.。.pnpm为虚拟磁盘目录,它同样以扁平化的方式存放着所有包
而与.pnpm同级的还有安装的包,它们后面带一个箭头符号,表明它们是一个软连接,可以理解为路径信息,指向.pnpm中对应的包文件夹下的node.modules中的对应文件,而这个文件和前面提到的store文件夹中的对应文件形成一个硬链接, 可以理解为都指向同一块数据内容。这么做的好处是能够确保每个包的上下文隔离。
还是官网的图比较直白,这里直接上图,结构一目了然:
使用pnpm
pnpm的使用并没有什么特殊之处,和npm和yarn类似
pnpm init:初始化项目pnpm install或简写pnpm i:安装全部依赖pnpm add <pkg>: 安装指定依赖,保存到devDependencies配置项下;-D参数 保存到devDependencies配置项下pnpm update: 所有依赖更新到最新版本pnpm remove <pkg>: 移除指定依赖