pnpm

包管理器主要关注的问题

  • 减少同包同版本的依赖被多次安装,减少磁盘空间占用,加快安装速度
  • Windows 存在最大路径长度限制open in new window,最长为 260 个字符(Windows 10 版本 1607 及更高版本中可修改)
  • 解决“幽灵依赖”问题,未在dependencies里声明的包,不可以在代码里直接import
  • 解决“依赖分身”问题

参考文档

软链与硬链

区别

在执行过程中,软链的文件路径和软链实际地址是不匹配的。

// <root>/index.js
console.log(process.cwd());
console.log(__filename);
1
2
3
# 创建 link 文件夹
mkdir link

# 创建 index.js 的一个软链
ln -s index.js link/index-sl.js

# 创建 index.js 的一个硬链
ln <root>/index.js <root>/link/index-hl.js
1
2
3
4
5
6
7
8
node index.js
# <root>
# <root>/index.js


node link/index-sl.js
# <root>
# <root>/index-hl.js

node link/index-hl.js
# <root>
# <root>/link/index-hl.js
1
2
3
4
5
6
7
8
9
10
11
12

分别执行index.js及它的软链index-sl.js和硬链index-hl.js可以发现,软链的__filename显示的是源文件index.js的文件地址。

在 pnpm 里的作用

软链在 pnpm 里(结合着依赖查找规则)主要是

  • 解决幽灵依赖的问题,只有项目package.jsondependencies里显示声明的依赖,才会出现在<root>/node_modules里,且该目录下的文件夹都是软链。
  • 解决依赖的 npm 包路径过长的问题。根据软链的特性,npm 包路径的长度最长也就是.pnpm/<packagename>@<version>/node_modules/<packagename>

硬链在 pnpm 里主要是为了:

  • 实现文件复用,保证相同的包不会被重复下载。

pnpm 存在的问题

待解决

pnpm 对 peer dependencies 为什么有不一样的处理?