当使用 npm 或 yarn安装依赖包时,所有软件包都将被提升到 node_modules 的根目录下。导致源码可以访问本不属于当前项目安装的依赖包。
pnpm只将安装的依赖包放到node_modules 的根目录下,其余的安装包都放在node_modules/.pnpm目录下,程序无法直接引用到对应的依赖包。也就解决了
幽灵依赖
的问题。
幽灵依赖:
所谓幽灵依赖就是,我们并没有安装对应的依赖包,但是我们却能在我们的程序中使用的依赖包。
例如:npm/yarn 安装vue的时候,都需要复制一份vue的源码,所以两个工程各自复制了一份vue的代码,占据了20MB的空间
pnpm使用硬链接的方式(windows下使用的是联结(感觉没啥区别可能是翻译的问题 (
▽
)),最终目的是一样的)
pnpm在node_modues/.pnpm文件夹中建立硬链接,连接到.pnpm-store中的文件,所以在磁盘中只占据了10MB,其它工程再安装vue,也只是在node_modules文件夹下建立一个新的硬链接即可。而不用复制文件所以速度自然快,占据的空间也小了。
硬链接与软链接
硬链接
:比如为文件 a 建立了硬链接 b、c,那么a、b、c这三个文件只要还有一个文件没有删除,那么这个文件就可以通过没有删除的名称(链接)访问。
软链接
:有些类似于快捷方式,比如为文件 a 建立了软链接 b、c,如果删除b或者c,仍然可以通过a访问到该文件,但是如果删除了a,那么b、c软链接就不可用了。
我们在window系统中有时候会碰到快捷方式不可用的情况,就是因为源文件已经被删除了,所以快捷方式也就无效了。
默认情况下pnpm的全局存储位置,在当前磁盘的根目录下的
.pnpm-store
中,可以通过下面的命令指定存储位置:
···cmd
pnpm config set store-dir /path/to/.pnpm-store
···
包存储位置应该和程序在同一个驱动器和文件系统(比如window下注意不能跨盘符操作)上否则包将被复制而不是链接(变回和npm一样了)。这是由于硬链接工作方式的限制的,因为一个文件系统上的文件无法寻址另一个文件系统中的位置。所以一般情况下不要修改这个存储位置,使用默认的就行了。
硬链接文件有两个限制(Unix/Linux 和 Windows 也都如此)
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。