pnpm、硬链接、软连接、pnpm原理

1. 什么是pnpm

1.1 什么是pnpm呢?我们来看一下官方的解释:

  • pnpm:我们可以理解成是performant npm缩写(高性能的npm);
  • 官网 ,中文文档

 

1.2 硬连接和软连接的概念

  1. 硬链接(hard link):
  • 硬链接(英语:hard link)是电脑文件系统中的多个文件平等地共享同一个文件存储单元;
  • 删除一个文件名字后,还可以用其它名字继续访问该文件;
  1. 符号链接(软链接soft link、Symbolic link):
  • 符号链接(软链接、Symbolic link)是一类特殊的文件;
  • 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用;
  • 硬连接和软连接在操作系统中的抽象

 链接和软连接的演练

 

  • 文件的拷贝 copy abc.js abc_copy123.js

 

  • 硬链接

 创立硬链接报错

 

添加cmd /c

实现效果 aaa.js文件修改 会影响到 bbb.js

 

  • 软连接:快捷方式,指向原来的文件。

打开fy.soft.js所在文件目录,会跳到fy.js上

 

2. pnpm到底做了什么呢?

  1. 当使用 npm 或 Yarn 时,如果你有100个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。
  2. 如果是使用 pnpm,依赖包将被 存放在一个统一的位置,因此:
  • 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
  • 如果你对同一依赖包需要使用不同的版本,则仅有 版本之间不同的文件会被存储起来;
  • 所有文件都保存在硬盘上的统一的位置:
    • 当安装软件包时, 其包含的所有文件都会硬链接到此位置,而不会占用 额外的硬盘空间;
    • 这让你可以在项目之间方便地共享相同版本的 依赖包;

3. pnpm创建非扁平的 node_modules 目录

  1. 当使用 npm 或 Yarn Classic 安装依赖包时,所有软件包都将被提升到 node_modules 的 根目录下。
  • 其结果是,源码可以访问 本不属于当前项目所设定的依赖包;

 链接过程思路

 具体示例:

使用npm 安装

image

 

image

 

可以看到我们的项目依赖中只有一个 express, 但是执行 npm i 之后 node_modules 中竟然有这么多的包,对于开发来说本身问题并不大,因为 node_modules 只是安装一次,但是 node 的寻找包的规则,这些包都是可以在项目中直接被引用的,也就是说我们在项目中引用了未在 package.json 中声明的包,这显然是不安全的,这种情况也被称为幽灵依赖。

 

那 pnpm 是如何解决这个问题的呢?

答案就是软链接,我们先用 pnpm 重新装一下上面的包。

image

 可以看到 node_modules 结构非常清晰,但是这个 express 文件夹只是一个软链接, 它的真正存储的地方在图中的 .pnpm 文件夹中。

image

 

这样的通过软链接的设计既保证了不会出现幽灵依赖的问题,同时也能兼容 node 的寻找模块方式。

所以说 pnpm 的软链接就是将 node_modules 里的文件软链接到对应的 .pnpm/[package_name]@version/node_modules/[package_name] 中。

image

 

我们可以看到当前的 index.js inode节点为 1245537 并且有9个相同的硬链接。

 

接下来我们新建 pnpm-t1 项目并安装 express

mkdir pnpm-t1 && cd pnpm-t1
pnpm init -y
pnpm add express

image

可以看到 pnpm-t1 中 express 下的 index.js inode 节点仍为 1245537,并且这个文件的硬链接数量已经增加到了 10 个。也就是说 express 下的 index.js 实际上是被复用的。

 

4. 安装和使用

1.安装

 npm install pnpm -g

以下 是一个与 npm 等价命令的对照表,帮助你快速入门:

2.pnpm的存储store

 

posted @ 2025-05-09 19:46  当下是吾  阅读(320)  评论(0)    收藏  举报