什么是PNPM?
#node #pnpm

什么是PNPM?

https://res.cloudinary.com/practicaldev/image/fetch/s--5LB7xZGh--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8e2at4huuuv08y24jvg.png

在矮人基金会,我们一直在寻找新技术。研究PNPM最初是从Next.js使用的包装经理使用的研究。然后,我们尝试对dwarves/react-toolkit进行实验,这使我们对使用软件包管理器的一些成本效益有了一些见解。

介绍

pnpm是node.js的软件包管理器,代表performant npm。它是在2016年推出的,同年发行了纱线。 PNPM是支持MonorePos的快速磁盘效率的软件包管理器。默认情况下,它会创建非燃料node_modules,因此代码无法访问任意软件包。 PNPM在三个阶段进行安装:

  1. 依赖分辨率 - 包装管理器识别并获取所有必需的依赖项。
  2. 目录结构计算 - 基于这些依赖项,它计算了node_modules目录的布局。
  3. 链接依赖关系 - 它在所有剩余依赖项中检索并建立了从商店到node_modules的坚硬链接。

PNPM的优势

PNPM是大多数包装管理人员的表现替代方案。以下是使用PNPM的一些优点:

  • 通过使用内容 - 适用的商店用于包装
  • 来保存磁盘空间
  • 使用三阶段过程提高安装速度
  • 为较大项目创建一个非静电node_modules目录

保存磁盘空间

假设您在您的个人计算机上有10个Node.js项目,如果您使用NPM/纱线,则将有10个node_modules文件夹。

如果您使用PNPM,情况将会有所不同。它向我们介绍了一个新概念,称为A content-Addressable商店。请参阅下图:

node modules

(来源:https://pnpm.io/motivation#saving-disk-space

您可以看到,PNPM不会将软件包存储在node_modules文件夹中,而是将其存储在Content-Address-Address-Address商店中。因此,在使用PNPM的项目的node_modules文件夹中,包装是链接的

因此,包装版本仅存储一次磁盘

提升安装Speed

PNPM在三个阶段进行安装:

  1. 依赖分辨率:识别并获得商店的所有必要依赖项。
  2. 目录结构计算:基于这些依赖项确定node_modules目录的布局。
  3. 链接依赖性:在所有剩余依赖项中检索并建立从商店到node_modules的硬链接。

package installation progress

(来源:https://pnpm.io/motivation#boosting-installation-speed

这种方法要比常规的识别,获取和保存所有依赖关系直接到node_modules目录的常规方法要快得多。

package installation progress 2

(来源:https://pnpm.io/motivation#boosting-installation-speed

创建一个非静电node_modules目录

首先,我们必须问为什么NPM选择Flat node_modules结构方法。

在NPM版本3的发布之前,请回到时间,此时,NPM中的node_modules仍处于非平板结构中。如下示例所示:

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

这种方法有一些问题,例如:

  • 发生了Windows操作系统上长目录路径的问题,因为该软件包创建了一个太深的依赖树
  • 包裹在许多地方被复制,因为它们是在不同依赖项中需要的

因此,为了解决此问题,NPM决定将node_modules弄平。在NPM版本3之后,node_modules目录的结构将成为这样:

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

因此,源代码可以访问项目中未明确声明的依赖项。按照上面的示例之后,即使项目仅使用 foo 软件包,我们也可以完全使用 bar package而无需在package.json.json中声明。

与NPM版本3不同,PNPM试图在不扁平的情况下解决问题。请按照下面的示例:

node_modules
├─ foo -> .registry.npmjs.org/foo/1.0.0/node_modules/foo
└─ .registry.npmjs.org
   ├─ foo/1.0.0/node_modules
   |  ├─ bar -> ../../bar/2.0.0/node_modules/bar
   |  └─ foo
   |     ├─ index.js
   |     └─ package.json
   └─ bar/2.0.0/node_modules
      └─ bar
         ├─ index.js
         └─ package.json
---------------------------------------
->: a symlink (or junction on Windows)

foo 软件包仍然包含其依赖性 bar 以符号链接的形式。很特别的是, foo 没有内部的node_modules,这样, foo 的依赖树就不会像NPM那样深v3的发布。

乍一看,该结构似乎很复杂,但是当从事较大的项目时,您会发现这种结构比NPM/YARN

更清晰

PNPM的缺点

但是,使用PNPM存在一些缺点。其中之一是,在安装first time的软件包时,它可以比其他软件包管理器(如纱线或NPM)慢。也可能很难与某些构建工具(例如Webpack)一起使用。

pnpm的node_modules布局使用symbolic links to create a nested structure of dependencies。这对某些设置有一些影响,其中Windows机器或某些权限的Linux环境可能难以访问这些链接。

与PNPM的另一个潜在问题是,其嵌套的依赖性结构可能与某些较旧的软件包不兼容。

展示柜

值得庆幸的是,PNPM由众多大型公司雇用,证明其有效性。对于更新的列表,您可以访问https://pnpm.io/users

showcase

结论

PNPM是Node.js的软件包管理器,比其他流行的软件包管理器提供了多个优点,包括节省磁盘空间和提高安装速度。它还创建了一个非静电node_modules目录,这可能对大型项目有帮助。但是,使用PNPM存在一些潜在的缺点,例如与某些旧软件包的兼容性问题以及初始软件包安装时间较慢。尽管存在这些缺点,但PNPM还是由许多大型公司使用,可能值得考虑您自己的项目。

总体而言,PNPM提供了一些独特的好处,是Node.js其他包装管理人员的可行替代方案。值得探索是否是特定用例的正确选择。

参考:

上关注我们

网站:https://dwarves.foundation
不和谐:https://discord.gg/dwarvesv
粉丝页:https://www.facebook.com/dwarvesf
LinkedIn:https://www.linkedin.com/company/dwarvesf
替代:https://note.d.foundation/