图 1

pnpm。使用pnpm代替npm可以减少大量的模块磁盘占用。这不就是黑洞毁灭者吗?

使用

首先安装

curl -f https://get.pnpm.io/v6.14.js | node - add --global pnpm

或者也可以通过npm进行全局安装

npm install -g pnpm

依赖安装

pnpm install

# 安装某个依赖
pnpm add <pkg>

# 运行
pnpm <cmd>

空间对比

使用npm

图 2

使用pnpm

图 3

效果显著。

为啥不用yarn

对比一下npm和yarn,Yarn 是为了弥补 npm 的一些缺陷而出现的。yarn的优点:

  1. 安装速度快。具备并行安装,npm按照队列执行每个pkg的安装,yarn是同步执行所有安装任务。
  2. 安装版本统一。安装会生成一个版本lock文件。

yarn和npm一样,具有扁平依赖树,而扁平依赖树具有的问题:

  1. 模块和模块之间可以访问,即使他们没有依赖关系
  2. 扁平依赖树算法复杂
  3. node_module内部的模块还会带有node_module

而pnpm并没有扁平依赖树。

在npm@3前,依赖如下:

node_modules
└─ foo
   ├─ index.js
   ├─ package.json
   └─ node_modules
      └─ bar
         ├─ index.js
         └─ package.json

这样的结构会有这样的问题:

  1. 依赖足够深的话,会导致路径非常长,在windows下会有长路径问题。
  2. 当依赖各种依赖的时候,会让依赖进行多次复制拷贝。

在npm@3之后,依赖树进行扁平化:

node_modules
├─ foo
|  ├─ index.js
|  └─ package.json
└─ bar
   ├─ index.js
   └─ package.json

pnpm解决了npm@2有的问题,但却不用npm@3的扁平依赖树。

pnpm引入

如果是本地的node_modules:

require('foo')

会引入node_modules/foo/index.js,而如果是pnpm,则会引入node_modules/.registry.npmjs.org/foo/1.0.0/node_modules/foo/index.js