高性能的包管理器Pnpm,你学会了吗?

网站建设4年前发布
73 0 0

performant npm。高性能的 npm。它的 slogan 是:,Fast, disk space efficient package manager。,快速的,节省磁盘空间的包管理工具。,快速。pnpm 比替代方案快 2 倍数据来源[1],采用的是一种嵌套安装的方式。如下图所示:,缺点:,将依赖偏平化:,缺点:,安装很慢。相同的包安装了两次,占用磁盘空间,相对的安装的速度也会变慢,非单例。当两个不同的组件调用 require("library-f") 时,它们可能会得到两个不同的库实例,这意味着可能会突然出现两个单例的实例(换言之,底层的 “global” 变量被分配到两个不同的闭包中)。会使我们的调试变得非常困难,inode,每一个文件都有一个唯一的 inode,它包含文件的元信息,在访问文件时,对应的元信息会被 copy 到内存去实现文件的访问。,可以通过 stat 命令去查看某个文件的元信息。,hard link,硬链接可以理解为是一个相互的指针,创建的 hardlink 指向源文件的 inode,系统并不为它重新分配 inode。硬链接不管有多少个,都指向的是同一个 inode 节点,这意味着当你修改源文件或者链接文件的时候,都会做同步的修改。每新建一个 hardlink 会把节点连接数增加,只要节点的链接数非零,文件就一直存在,不管你删除的是源文件还是 hradlink。只要有一个存在,文件就存在。,.pnpm 中的每个文件都是来自内容可寻址存储的硬链接,soft link,软链接可以理解为是一个单向指针,是一个独立的文件且拥有独立的 inode,永远指向源文件,这就类比于 Windows 系统的快捷方式。删除源文件,软链接就会失效。,修改了软链接或硬链接的文件,另外的硬链接或软链接以及源文件都会发生变化,这里感觉是需要小心的,特别是修改文件以调试的时候,记得还原回去,否则另外一个项目用到的时候,可能会出问题,node_modules 中只有直接依赖的包,而没有间接依赖的包。通过软链接到.pnpm 目录中,虚拟存储目录——.pnpm,所有直接和间接依赖项都链接到此目录中。该目录通过 @ 来实现相同模块不同版本之间隔离和复用。,pnpm在全局通过Store来存储所有的 node_modules 依赖,并且在 .pnpm 中存储项目的hard links,在使用 pnpm 对项目安装依赖的时候,如果某个依赖在 sotre 目录中存在了话,那么就会直接从 store 目录里面去 hard-link,避免了二次安装带来的时间消耗,如果依赖在 store 目录里面不存在的话,就会去下载一次。,假如全局的包变得非常大怎么办?使用方法为 pnpm store prune ,它提供了一种用于删除一些不被全局项目所引用到的 packages 的功能,例如有个包 axios@1.0.0 被一个项目所引用了,但是某次修改使得项目里这个包被更新到了 1.0.1 ,那么 store 里面的 1.0.0 的 axios 就就成了个不被引用的包,执行 pnpm store prune 就可以在 store 里面删掉它了。,我们来看一张原理图:,我们项目中有一个依赖 bar@1.0.0。bar@1.0.0也有一个依赖 foo@1.0.0。,.pnpm/foo@1.0.0 一样通过硬链接指向 Store,我们现在可能用的是 npm 或者 yarn,那我们如何更好的过渡到 pnpm?或者会不会有什么问题?,问题:,pnpm 通过巧妙硬链接 + 软链接结合的方式完全实现了依赖树结构的 node_modules,并且严格遵循了 Node.js 的模块解析标准,解决了幻影依赖和 npm 分身的问题。并且通过全局只保存一份在 ~/.pnpm-store 的方式,在不同的项目中进行 install 的速度也会变得更快,也解决了磁盘空间占用的问题,pnpm: 最先进的包管理工具[6],中文官网[7],npm 存在的问题以及 pnpm 是怎么处理的[8],[1]数据来源: https://github.com/pnpm/benchmarks-of-javascript-package-managers,[2]简单实践参考: https://zhuanlan.zhihu.com/p/373935751,[3]参考: http://npm.github.io/how-npm-works-docs/npm3/non-determinism.htm,l[4]参考: https://pnpm.io/zh/cli/import,[5]参考: https://pnpm.io/zh/only-allow-pnpm[6]pnpm: 最先进的包管理工具: https://www.aisoutu.com/a/1218460,[7]中文官网: https://www.pnpm.cn/,[8]npm 存在的问题以及 pnpm 是怎么处理的: https://www.yuexunjiang.me/blog/problems-with-npm-and-how-pnpm-handles-them/

© 版权声明

相关文章