npm、yarn和pnpm

1 node_modules安装方式

在npm@3之前是以嵌套结构方式安装依赖包,存在两个问题:

  • 依赖路径太长
  • 多个包依赖一个相同包时,本地磁盘会存储多个相同的包

npm@3和yarn使用扁平化结构,node_modules变成所有包放在同一层级

注意 :多个版本的包只有一个会被提升至顶层,其他版本的包会嵌套安装到各自依赖中

哪个版本的包被提升依赖于package.json中包的前后顺序,于是又会出现新的问题:
依赖结构不一致导致扁平化后的结果也不一致

于是出现package-lock.json和yarn.lock保证install后产生确定的依赖结构

幽灵依赖:是指在package.json中未定义的依赖,但在项目中依然可以正确被引用到

第二个问题 是幽灵依赖的产生:因为扁平化依赖包被提升至顶层,导致用户可以直接引用它,存在问题是引用版本不兼容,以及当项目不再依赖原始包时,直接引用依赖包会出现问题

第三个问题 是:依赖分身和依赖提升机制可能导致大量依赖被重复安装,以下示例无论提升B@1.0还是B@2.0都会存在重复版本包被安装

2 yarn解决了上面哪些问题?

  • 提升安装速度:npm安装包时是串行的,每个包按照顺序安装;yarn采用并行操作。在缓存中,yarn会将每个包缓存在磁盘上
  • 使用yarn.lock记录依赖信息,保证得到稳定的依赖结构

注意:没有解决幽灵依赖和依赖分身问题

3 pnpm如何解决上述问题?

内存寻址存储策略:将包安装在系统的全局存储中,依赖的每个版本只会安装一次,在引用依赖时,会通过硬链接和软链接找到该文件,为实现此过程,node_modules下会出现.pnpm目录

  • 硬链接:使用户可以通过路径查找到全局存储中的源文件
  • 软链接:通过它可以找到对应磁盘目录下的依赖地址

(1)幽灵依赖问题 :只有直接依赖会平铺在node_modules下,子依赖不会被提升

(2)依赖分身问题:相同依赖只会在全局存储中安装一次。

弊端:

  • pnpm创建的node_modules依赖于软链接,在不支持软链接的环境中无法使用,例如:Electron
  • 依赖源文件安装在全局存储中,调试依赖或给依赖打补丁不方便
相关推荐
剪刀石头布啊6 分钟前
泛洪DFS、BFS
前端
qetfw6 分钟前
Windows Server AD CS:根 CA、Web 证书模板与域内自动注册
前端·windows·windows-server
剪刀石头布啊6 分钟前
为什么React组件很少前缀,而vue的不少组件都有前缀
前端
剪刀石头布啊12 分钟前
gird网格布局
前端
啃火龙果的兔子14 分钟前
Google Chrome(谷歌浏览器)常用快捷键
前端·chrome
剪刀石头布啊16 分钟前
js真的是单线程实现异步并发么?
前端
剪刀石头布啊21 分钟前
js中改变this指向的操作有哪些
前端
剪刀石头布啊21 分钟前
vue、react 列表中使用 index 作为 key 的话,修改某一个元素后会发生什么
前端
方方洛23 分钟前
glowglow:语言无关的语法高亮器是怎么实现的
前端·前端框架
java_nnnn1 小时前
JavaEE进阶-HTML基础认识
前端·java-ee·html