作者:海蓝透了我的心 | 来源:互联网 | 2022-11-30 17:30
有一个称为Plug'n'Play的新的亮纱功能。
我想知道它到底是做什么的?
我知道它正在创建一个.pnp
文件夹和一个.pnp.js
文件,但是它会更改计算机上的其他任何内容,例如某个地方的配置文件吗?
谢谢。
1> Maël Nison..:
我设计并实现了PnP,所以我可以聊几个小时
tl; dr:我们只写.pnp.js
和.pnp
文件夹(在常规Yarn缓存的顶部)。我们不会在其他任何地方存储配置。
没有即插即用
当您运行时yarn install
(即使没有PnP),也会发生一些事情:
如果您使用脱机镜像功能,我们将从注册表中下载tarball并将其存储在脱机镜像文件夹中
无论您是否使用脱机镜像,我们都将解压缩所有下载的tarball并将其文件存储在Yarn缓存中
然后,我们确定应将缓存中的哪些文件复制到文件中的哪个位置 node_modules
我们应用计算出的更改(rsync
基本上是一堆操作)
使用即插即用
使用PnP,工作流程如下:
无需更改,我们从离线镜像的注册表中下载tarball(如果已启用)
无需更改,我们仍将其解压缩到Yarn缓存中
我们生成一个文件.pnp.js
¹
就是这样。除了.pnp.js
文件(和缓存,没有其他生成的文件)之外,没有其他生成的文件。
¹ 如您所述,我们还在项目中生成了一个.pnp
文件夹(.yarn
从Yarn 2开始)。该文件夹旨在包含两种类型的数据:
拔出的软件包是必须在项目本地的软件包。通常,这些是带有安装后脚本的软件包(我们无法将它们存储到缓存中,因为生成的工件可能与一个项目不同。
虚拟包,这是为您的依赖关系树中的每个包创建的符号链接,列出了对等依赖项。无需赘述,它们是设计的必要部分,并且需要require.resolve
像以前一样进行工作。从Yarn 2开始,这些文件不再存在
它是如何工作的?
该.pnp.js
文件包含与以下内容类似的信息:
webpack@1.0.0 -> /cache/webpack-1.0.0/
-> it depends on lodash@1.0.0
lodash@1.0.0 -> /cache/lodash-1.0.0/
-> no dependencies
通过获取这些信息,分辨率可以正确地推断出,当其中的文件/cache/webpack-1.0.0
对进行require调用时lodash
,必须从中加载所需的文件/cache/lodash-1.0.0
。实际上,它有点复杂(我们保留了一个逆映射以提高性能,我们使用相对路径来确保可移植性,等等),但是这里有一个基本概念。
奖励回合:使用即插即用+压缩加载(纱线2)
奖励:使用Yarn 2,我们将进一步改善此工作流程。它将是这样的:
我们从注册表中下载tarball,然后将其存储到缓存中(脱机镜像和缓存之间没有更多区别-它们是相同的)
我们生成与.pnp.js
以前相同的文件
就是这样!如您所见,我们不再对软件包进行解压缩(相反,我们在运行时使用Node loader从软件包档案中读取它们)。
这样做有一个非常有趣的属性:如果缓存和.pnp.js
文件都在其中,则无需运行即可运行yarn install
应用程序!为了确保拥有这些文件,您只需要将它们添加到存储库中,然后像对待其他所有内容一样对它们进行版本控制即可。²
这非常有用,因为您无需记住yarn install
在git rebase
,,git pull
或之后运行git checkout
,并且CI系统不需要特殊的设置即可变得更快,更稳定-只需克隆您的应用程序即可使用。
² 在有人提到它之前,在存储库中检入二进制文件是完全可以的。node_modules
在存储库中检入非常不好的原因是由于文本文件的数量成倍增加,这给Git带来了极大的压力-从技术上讲,从哲学上讲,由于无法进行代码审查。
在我描述的情况下,我们不会遇到相同的问题,因为文件的数量受到限制(每个程序包一个文件),并且查看它们非常容易-实际上,最好能清楚地看到公关将许多新软件包添加到您的项目中!