关于yarn 的Plug‘n‘Play特性

yarn 的Plug’n’Play特性提供了一种新的包管理的策略,主要是为了解决之前yarn 包管理的的一些痛点,下面主要分当前包管理的原理及问题Plug’n’Play的实现方案,****Plug’n’Play使用方式三部分介绍Plug’n’Play(简称PnP)特性。

当前包管理的原理及问题

PnP主要是为了解决当前依赖管理方式 安装依赖,引用依赖效率低下的问题,这里介绍下现有安装依赖和引用依赖的方式

安装依赖

当执行yarn intall的时候,一般会执行如下四个操作:

  1. 解析依赖版本号

  2. 下载对应版本模块的tar包到本地离线缓存(离线缓存目录,Windows下目录为:Users/[user]/AppData/Local/Yarn/Cache/v6/)

  3. 解压镜像

  4. 将缓存中的包拷贝到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’)) 一个包时,

  1. 会先从当前目录中找node_moduels目录中的包,没有找到则去父目录中找,依次类推,直到根目录。

  2. 找到node_moduels后,会在node_modules中寻找该包,一般是找package.json中的包名

由此可以看出yarn 之前的管理方式有以下缺点:

  1. 大量的文件I/O,导致安装依赖和引用依赖效率低下

  2. 由于每个工程下都挂载一个node_modules,占用磁盘空间大

Plug’n’Play实现方案

PnP 的工作原理是通过通过.pnp.js维护一张静态映射表,替代了从依赖缓存拷贝到node_moduels的方案

这里重点介绍下.pnp.js这个脚本文件

图片
从图中我们可以看出,.pnp.js中主要包含如下信息:

包名、版本号、包的缓存路径

(Users/[username]/AppData/Local/Yarn/Cache/v6),对于不同版本的同一个包会安装多个包
图片

如上图,对于不同版本的同一个包,安装了多份

优点

很显然,我们可以看到,使用这种方式:

  1. 安装依赖速度明显的得到了提升

  2. 减少了磁盘的占用空间

Plug’n’Play使用方式

yarn --pnp

执行如上命令,会进行如下操作

  1. 自动创建.pnp.js文件

  2. 如果已经安装的包在yarn缓存目录中没有,则会重新下载安装到缓存目录中

  3. 并package.json中添加如下配置:

"installConfig": {
"pnp": true
 }

如果,不想使用PnP方式了,可以改为false,至此再安装包就不会创建node_modules了,也不会将新安装的包拷贝到已有的node_modules中了。

官网地址:

https://yarnpkg.com/features/pnp

关于PnP的特性就介绍到这里,另外推荐大家在学习的时候,尤其是对于新概念,新知识学习的时候,最好要亲自试验,亲自试验,亲自试验⏰⏰⏰,不要仅仅看看就可以了,反正对我这这种笨的人,只要是没亲自试验过的知识,不管是从哪薅来的,最终都没有掌握😭😭😭😭😭

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值