yarn 的Plug'n'Play特性提供了一种新的包管理的策略,主要是为了解决之前yarn 包管理的的一些痛点,下面主要分当前包管理的原理及问题,Plug'n'Play的实现方案,Plug'n'Play使用方式三部分介绍Plug'n'Play(简称PnP)特性。
当前包管理的原理及问题
PnP主要是为了解决当前依赖管理方式 安装依赖,引用依赖效率低下的问题,这里介绍下现有安装依赖和引用依赖的方式
安装依赖当执行yarn intall的时候,一般会执行如下四个操作:
解析依赖版本号
下载对应版本模块的tar包到本地离线缓存(离线缓存目录,Windows下目录为:Users/[user]/AppData/Local/Yarn/Cache/v6/)
解压镜像
-
将缓存中的包拷贝到node_modules中,另外包中的依赖也会拷贝到对应包的node_modules中
注意:
如果安装的包在node_modules根目录中有相同的包,会直接替换node_modules根目录中的包
如果多个包有不同版本号的相同的依赖包,则将对应版本的依赖包,拷贝到对应包的node_modules 中,另外最后一个安装该依赖包的包引用的是node_modules中的包
如上图,以koa和express为例,因为koa和express都依赖了debug包,且依赖的debug包的版本号不一样,又因为先安装的koa,后安装的express,所以express引用根目录node_modules中的包,而koa包目录中会再创建一个node_modules目录,将对应版本的debug包拷贝到自己的node_moduels中。(整体介绍的比较啰嗦,如果已懂可以略过,没有的话,看完最好亲自试验一番)
引用依赖当我们在引用(require('koa')) 一个包时,
会先从当前目录中找node_moduels目录中的包,没有找到则去父目录中找,依次类推,直到根目录。
找到node_moduels后,会在node_modules中寻找该包,一般是找package.json中的包名
由此可以看出yarn 之前的管理方式有以下缺点:
大量的文件I/O,导致安装依赖和引用依赖效率低下
由于每个工程下都挂载一个node_modules,占用磁盘空间大
Plug'n'Play实现方案
PnP 的工作原理是通过通过.pnp.js维护一张静态映射表,替代了从依赖缓存拷贝到node_moduels的方案
这里重点介绍下.pnp.js这个脚本文件
从图中我们可以看出,.pnp.js中主要包含如下信息:
包名、版本号、包的缓存路径
(Users/[username]/AppData/Local/Yarn/Cache/v6),对于不同版本的同一个包会安装多个包
如上图,对于不同版本的同一个包,安装了多份
优点很显然,我们可以看到,使用这种方式:
安装依赖速度明显的得到了提升
减少了磁盘的占用空间
Plug'n'Play使用方式
yarn --pnp
执行如上命令,会进行如下操作
自动创建.pnp.js文件
如果已经安装的包在yarn缓存目录中没有,则会重新下载安装到缓存目录中
并package.json中添加如下配置:
"installConfig": {
"pnp": true
}
如果,不想使用PnP方式了,可以改为false,至此再安装包就不会创建node_modules了,也不会将新安装的包拷贝到已有的node_modules中了。
官网地址:https://yarnpkg.com/features/pnp关于PnP的特性就介绍到这里,另外推荐大家在学习的时候,尤其是对于新概念,新知识学习的时候,最好要亲自试验,亲自试验,亲自试验⏰⏰⏰,不要仅仅看看就可以了,反正对我这这种笨的人,只要是没亲自试验过的知识,不管是从哪薅来的,最终都没有掌握😭😭😭😭😭
本文使用 文章同步助手 同步