什么是PNPM?
在矮人基金会,我们一直在寻找新技术。研究PNPM最初是从Next.js使用的包装经理使用的研究。然后,我们尝试对dwarves/react-toolkit进行实验,这使我们对使用软件包管理器的一些成本效益有了一些见解。
介绍
pnpm是node.js的软件包管理器,代表performant npm。它是在2016年推出的,同年发行了纱线。 PNPM是支持MonorePos的快速磁盘效率的软件包管理器。默认情况下,它会创建非燃料node_modules
,因此代码无法访问任意软件包。 PNPM在三个阶段进行安装:
- 依赖分辨率 - 包装管理器识别并获取所有必需的依赖项。
-
目录结构计算 - 基于这些依赖项,它计算了
node_modules
目录的布局。 -
链接依赖关系 - 它在所有剩余依赖项中检索并建立了从商店到
node_modules
的坚硬链接。
PNPM的优势
PNPM是大多数包装管理人员的表现替代方案。以下是使用PNPM的一些优点:
- 通过使用内容 - 适用的商店用于包装 来保存磁盘空间
- 使用三阶段过程提高安装速度
- 为较大项目创建一个非静电node_modules目录
保存磁盘空间
假设您在您的个人计算机上有10个Node.js项目,如果您使用NPM/纱线,则将有10个node_modules
文件夹。
如果您使用PNPM,情况将会有所不同。它向我们介绍了一个新概念,称为A content-Addressable商店。请参阅下图:
(来源:https://pnpm.io/motivation#saving-disk-space)
您可以看到,PNPM不会将软件包存储在node_modules
文件夹中,而是将其存储在Content-Address-Address-Address商店中。因此,在使用PNPM的项目的node_modules
文件夹中,包装是链接的 。
因此,包装版本仅存储一次磁盘
提升安装Speed
PNPM在三个阶段进行安装:
- 依赖分辨率:识别并获得商店的所有必要依赖项。
- 目录结构计算:基于这些依赖项确定
node_modules
目录的布局。 - 链接依赖性:在所有剩余依赖项中检索并建立从商店到
node_modules
的硬链接。
(来源:https://pnpm.io/motivation#boosting-installation-speed)
这种方法要比常规的识别,获取和保存所有依赖关系直接到node_modules
目录的常规方法要快得多。
(来源: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。
结论
PNPM是Node.js的软件包管理器,比其他流行的软件包管理器提供了多个优点,包括节省磁盘空间和提高安装速度。它还创建了一个非静电node_modules
目录,这可能对大型项目有帮助。但是,使用PNPM存在一些潜在的缺点,例如与某些旧软件包的兼容性问题以及初始软件包安装时间较慢。尽管存在这些缺点,但PNPM还是由许多大型公司使用,可能值得考虑您自己的项目。
总体而言,PNPM提供了一些独特的好处,是Node.js其他包装管理人员的可行替代方案。值得探索是否是特定用例的正确选择。
参考:
- https://pnpm.io/motivation
- https://blog.bitsrc.io/pnpm-javascript-package-manager-4b5abd59dc9
- https://pnpm.io/faq#what-does-pnpm-stand-for
- https://medium.com/pnpm/why-should-we-use-pnpm-75ca4bfe7d93
- https://medium.com/@buffet_time/why-you-should-move-to-pnpm-82962f332418
- https://dev.to/stackblitz/what-is-pnpm-and-is-it-really-so-fast-and-space-efficient-29la
- https://refine.dev/blog/pnpm-vs-npm-and-yarn/
在
上关注我们网站:https://dwarves.foundation
不和谐:https://discord.gg/dwarvesv
粉丝页:https://www.facebook.com/dwarvesf
LinkedIn:https://www.linkedin.com/company/dwarvesf
替代:https://note.d.foundation/