abstract:

包办理工具;
扁平化;
依靠重复装置;
鬼魂依靠;
Link-软硬链接;

1.pnpm介绍

Fast, disk space efficient package manager — 快速的,节约磁盘空间的包办理工具。

ac737e5c2e3dc28235001c607e37b9a.png github地址

cdf72e3ca1abe3e84870ee387819ce8.png 官网地址

16.png NPM

15.png

小结 : pnpm 便是一个包办理器,用途与咱们常用的 npm、yarn 相同;
        特色: 快、节约磁盘空间、`安全`

2.常用包办理工具

2.1 npm2 (node 4+)

5.jpg

特色:
     1.非扁平化;
     2.依靠嵌套
问题:
    1.若多个包之间有公共的依靠,会重复装置,糟蹋磁盘空间;
    2. 模块实例不能同享;
    (比如 React 有一些内部变量,在两个不同包引进的 React 不是同一个模块实例,因而无法同享内部变量,
    导致一些不可预知的 bug。)
    3.windows 的文件途径最长是 260 多个字符,这样嵌套是会超越 windows 途径的长度限制的。

2.1 yarn/npm3+

7.jpg

特色:
     1.扁平化;
问题:
      1.依靠结构的`不确定性`2.扁平化算法本身的`复杂性`很高,耗时较长。
      3.项目中依然能够`不合法拜访(鬼魂依靠)`没有声明过依靠的包;
      4.提高只有一次,对于不同版别的依靠仍是会存在重复装置的问题;

2.1.1 不确定性

假如现在项目依靠两个包 foo 和 bar,这两个包的依靠又是这样的:

那么 npm/yarn install 的时分,经过扁平化处理之后,究竟是这样

仍是这样?

答案是: 都有或许。取决于 foo 和 bar 在 package.json中的方位,如果 foo 声明在前面,那么便是前面的结构,否则是后边的结构。

这便是为什么会产生依靠结构的不确定问题,也是 lock 文件诞生的原因,无论是package-lock.json(npm 5.x才呈现)仍是yarn.lock,都是为了确保 install 之后都产生确定的node_modules结构。

尽管如此,npm/yarn 本身仍是存在扁平化算法复杂package 不合法拜访的问题,影响功能和安全。

3.图解- pnpm

由于现有的包办理工具并没有着手去处理上述存在的问题,于是pnpm 的作者Zoltan Kochan决议重整旗鼓,这便是pnpm,一个全新的包办理工具,一套全新的依靠办理机制。

3.1节约磁盘空间

8.jpg

图的上半部分提醒了npm、yarn存在的问题,咱们的依靠是涣散办理的,例如咱们现在有一百个项目且都用到了lodash这个依靠(dependency),那么咱们就会在硬盘上保存100 份该依靠的副本

而这明显不是pnpm想要的,pnpm想要的模式是,咱们供给一个可装备的依靠库房地址(可寻址的存储,相同的文件依靠在该地址只存储一份,只占用一份存储空间;所有项目的依靠经过硬链接的方式拜访此库房;

因而,磁盘上节约了很多空间,这与项目和依靠项的数量成正比,并且装置速度要快得多!

eg:
例如A项目的依靠列表里有lodash,此时咱们的库房`(可寻址的存储)`并没有lodash,那么就会在库房里装置lodash,并为
A项目创立一个lodash硬链接;下一次,当咱们装置B项目的依靠,B项目也需求lodash时,就不会重复的去装置lodash了,
而是直接为B项目创立一个lodash硬链接;

3.2简单介绍下软硬链接

来自维基百科的解说:「硬链接(英语:hard link)」是计算机文件体系中的多个文件平等地同享同一个文件存储单元(如MFT条目、inode)。硬链接必须在同一个文件体系中;一般用户权限下的硬链接只能用于文件,不能用于目录,由于其父目录就有歧义了。删去一个文件姓名后,还能够用其它姓名持续拜访该文件。硬链接只能用于同一个文件体系(对于NTFS是限制于同一个分区)。不能用于不存在的文件。

概念:

  • inode : 文件夹、文件的ID ;
  • Hard-Link : 本身创立对 inode 的 link; links值加一;links值只要不为 0,就不会真正的删去文件。
  • Symbolic-Link : 本身依靠与其他文件对 inode 的link;创立软链links值不变, 如A软链接B,A能够经过B的硬链接拜访对应的inode内容;若B的link失效了,A也拜访不到对应内容了;(快捷方式)

点击打开一个文件,实际上是操作体系查出这个文件对应的inode值;再经过inode,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据

检查文件基本信息:
stat 文件名
eg: stat a.txt
检查文件 inode
ls -i 文件名 
eg: ls -i a.txt
创立硬链接:
ln 源文件名 新创立文件名
eg : ln a.txt b.txt
创立软链接(快捷方式):
eg: ln -s b.txt c.txt

10.jpg

14.png

3.3pnpm的依靠办理方式

原理图:
11.jpg
eg:pnpm install express

12.png

13.png

特色: 非扁平化,所见即所得(package.json),处理鬼魂依靠问题;(安全)
       依靠全局(指定磁盘途径)装置一次,详细项目经过硬链接拜访,不占用额定的磁盘空间;(节约磁盘空间、快)
       项目内嵌套依靠,若存在相同的依靠,经过软衔接的方式拜访;(节约磁盘空间、快) 

4.运用- pnpm

特色: 学习本钱不高,会运用yarn、npm几乎能够无缝切换到pnpm;

npm 指令 pnpm 等效
npm install pnpm install
npm i <pkg> [pnpm add <pkg>]
npm run <cmd> [pnpm <cmd>]
npm link [pnpm link]

当然,pnpm也供给了许多功能强大的指令,详见

5.拓宽

 npm link / yarn link  本质便是软衔接;
 pnpm 支持 monorepo;

文章参考:

关于现代包办理器的深度思考——为什么现在我更推荐 pnpm 而不是 npm/yarn?

从pnpm了解软硬链接的应用