关于java:pnpm-是凭什么对-npm-和-yarn-降维打击的

36次阅读

共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。

大家最近是不是常常听到 pnpm,我也一样。明天钻研了一下它的机制,的确厉害,对 yarn 和 npm 能够说是降维打击。
那具体好在哪里呢?咱们一起来看一下。
咱们依照包管理工具的倒退历史,从 npm2 开始讲起:

npm2

用 node 版本管理工具把 node 版本降到 4,那 npm 版本就是 2.x 了。

而后找个目录,执行下 npm init -y,疾速创立个 package.json
而后执行 npm install express,那么 express 包和它的依赖都会被下载下来:

开展 express,它也有 node_modules:

再开展几层,每个依赖都有本人的 node_modules:

也就是说 npm2 的 node_modules 是嵌套的。
这很失常呀?有什么不对么?
这样其实是有问题的,多个包之间难免会有公共的依赖,这样嵌套的话,同样的依赖会复制很屡次,会占据比拟大的磁盘空间。
这个还不是最大的问题,致命问题是 windows 的文件门路最长是 260 多个字符,这样嵌套是会超过 windows 门路的长度限度的。
过后 npm 还没解决,社区就进去新的解决方案了,就是 yarn:
yarn
yarn 是怎么解决依赖反复很屡次,嵌套门路过长的问题的呢?
铺平。所有的依赖不再一层层嵌套了,而是全副在同一层,这样也就没有依赖反复屡次的问题了,也就没有门路过长的问题了。
咱们把 node_modules 删了,用 yarn 再重新安装下,执行 yarn add express:
这时候 node_modules 就是这样了:

全副铺平在了一层,开展上面的包大部分是没有二层 node_modules 的:

当然也有的包还是有 node_modules 的,比方这样:

为什么还有嵌套呢?
因为一个包是可能有多个版本的,晋升只能晋升一个,所以前面再遇到雷同包的不同版本,仍然还是用嵌套的形式。
npm 起初降级到 3 之后,也是采纳这种铺平的计划了,和 yarn 很相似:

当然,yarn 还实现了 yarn.lock 来锁定依赖版本的性能,不过这个 npm 也实现了。
yarn 和 npm 都采纳了铺平的计划,这种计划就没有问题了么?
并不是,扁平化的计划也有相应的问题。
最次要的一个问题是幽灵依赖,也就是你明明没有申明在 dependencies 里的依赖,但在代码里却能够 require 进来。
这个也很容易了解,因为都铺平了嘛,那依赖的依赖也是能够找到的。
然而这样是有隐患的,因为没有显式依赖,万一有一天别的包不依赖这个包了,那你的代码也就不能跑了,因为你依赖这个包,然而当初不会被装置了。
这就是幽灵依赖的问题。
而且还有一个问题,就是下面提到的依赖包有多个版本的时候,只会晋升一个,那其余版本的包不还是复制了很屡次么,仍然有节约磁盘空间的问题。
那社区有没有解决这俩问题的思路呢?
当然有,这不是 pnpm 就进去了嘛。
那 pnpm 是怎么解决这俩问题的呢?
pnpm
回忆下 npm3 和 yarn 为什么要做 node_modules 扁平化?不就是因为同样的依赖会复制屡次,并且门路过长在 windows 下有问题么?
那如果不复制呢,比方通过 link。
首先介绍下 link,也就是软硬连贯,这是操作系统提供的机制,硬连贯就是同一个文件的不同援用,而软链接是新建一个文件,文件内容指向另一个门路。当然,这俩链接应用起来是差不多的。
如果不复制文件,只在全局仓库保留一份 npm 包的内容,其余的中央都 link 过来呢?
这样不会有复制屡次的磁盘空间节约,而且也不会有门路过长的问题。因为门路过长的限度实质上是不能有太深的目录层级,当初都是各个地位的目录的 link,并不是同一个目录,所以也不会有长度限度。
没错,pnpm 就是通过这种思路来实现的。
再把 node_modules 删掉,而后用 pnpm 从新装一遍,执行 pnpm install。
你会发现它打印了这样一句话:

包是从全局 store 硬连贯到虚构 store 的,这里的虚构 store 就是 node_modules/.pnpm。
咱们关上 node_modules 看一下:

的确不是扁平化的了,依赖了 express,那 node_modules 下就只有 express,没有幽灵依赖。
开展 .pnpm 看一下:

所有的依赖都在这里铺平了,都是从全局 store 硬连贯过去的,而后包和包之间的依赖关系是通过软链接组织的。
比方 .pnpm 下的 expresss,这些都是软链接,

也就是说,所有的依赖都是从全局 store 硬连贯到了 node_modules/.pnpm 下,而后之间通过软链接来相互依赖。
官网给了一张原理图,配合着看一下就明确了:

这就是 pnpm 的实现原理。
那么回过头来看一下,pnpm 为什么优良呢?
首先,最大的长处是节俭磁盘空间呀,一个包全局只保留一份,剩下的都是软硬连贯,这得节俭多少磁盘空间呀。作者:zxg_神说要有光链接:https://juejin.cn/post/712729… 起源:稀土掘金著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

正文完
 0