首页 > 其他分享 >认识主流包管理器

认识主流包管理器

时间:2023-06-27 13:55:28浏览次数:35  
标签:node 依赖 管理器 认识 嵌套 主流 版本 pnpm 安装

npm2

嵌套结构:这个版本下依赖是嵌套的,一个包的内部也会有node_modules,A依赖于B,B依赖于C,而外部可能有其他包也依赖于C,模块实例无法共享,于是会造成内存占用多、体积大的问题。而且对于C,它的路径可能会很长,windows很多程序无法处理超过260个字符的路径名。

版本控制:对于package.json中给定的版本号,同一个项目不同人装时可能出现版本不一致而产生的bug。

 "5.0.3":指定5.0.3版本
 "~5.0.3":安装5.0.x的最新版本
 "^5.0.3":安装5.x.x的最新版本

Yarn

  1. 速度快:

1)并行安装:无论 npm 还是 Yarn 在执行包的安装时,都会执行一系列任务。npm 是按照队列执行每个 package,也就是说必须要等到当前 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务,提高了性能。

2)离线模式:如果之前已经安装过一个软件包,用 Yarn 再次安装时直接从缓存中获取,就不用像 npm 那样再从网络下载了。(npm6也有缓存,但不支持离线模式)

  1. yarn.lock:

引入 yarn.lock 文件来管理依赖版本问题,保证每次安装都是一致的。(npm5的更新也加入了package-lock.json文件起同样效果)

  1. 扁平化:

解决了依赖重复下载,嵌套路径过长的问题。依赖不再是一层层嵌套,而是放在同一层。其实npm3的时候就已经设计出了扁平化的模式,但是npm3的扁平化仍有不少地方会出现嵌套,依赖同一个包的不同版本的情况,不同版本的出场顺序导致依赖结构的差异,如下图所示,vue-style-loader和webpack都依赖于json5这个包,而且外层还有个json5,只是它们的版本不同。

而使用yarn,可以避免这样的情况,json5作为一个包独立的放在了外层(虽然上例中,外层本身也有json5),vue-style-loader中不再有node_modules和json5

pnpm

pnpm是一代新的包管理工具,正被更多的人使用。它不再复制下载依赖,只在全局仓库保存一份 npm 包的内容,其他地方都使用link,软硬链接,这是操作系统提供的机制,硬连接就是同一个文件的不同引用,而软链接是新建一个文件,文件内容指向另一个路径。当然,这俩链接使用起来是差不多的。

这样不会有复制多次的磁盘空间浪费,而且也不会有路径过长的问题。因为路径过长的限制本质上是不能有太深的目录层级,现在都是各个位置的目录的 link,并不是同一个目录,所以也不会有长度限制。

包是从全局 store 硬连接到虚拟 store 的,这里的虚拟 store 就是 node_modules/.pnpm。

下例是一个仅安装了express的项目的node_modules结构

可以发现这里有express的硬链接文件,点进去后又是node_modules,为express项目需要的依赖,不过全是软链接文件互相依赖。

所以pnpm好就好在:1、节省磁盘空间,一个包全局就存一份,剩下的都是软硬连接。2、快,链接的方式不同于复制,会快不少。不过也有问题就在于pnpm要求node版本高,对于老项目而言会有兼容性问题。

总结:

  1. npm古早版本嵌套结构,又慢又占用磁盘多,还容易因路径过长导致问题。
  2. yarn采用扁平化结构占用少,并行下载和离线模式更快。
  3. pnpm使用软硬连接,更少占用且更快。但不兼容老项目。

 

标签:node,依赖,管理器,认识,嵌套,主流,版本,pnpm,安装
From: https://www.cnblogs.com/dirtycat/p/17508652.html

相关文章

  • Vue2.x 基本认识四:路由
    路由认识概念路由(route)就是一组(key -value)对应关系。多个路由由一个路由器(router)管理。key为路径,value可能是function或component。function是后端路由,用于请求服务器获取数据。component是前端路由,用于展示页面内容。但浏览器的路径改变时,对应的组件就会显示。作......
  • 主流的跨境电商导航有哪些?
    在当今数字化时代,跨境电商越来越受到欢迎,尽管它仍然面临着许多挑战和难题。在这个方面,许多人可能会感到困惑,不知道应该如何开始这项业务。因此,选择一款好的跨境电商导航是十分必要的。首先,一个好的跨境电商导航必须具备以下两个特点:一、信息资源丰富一个好的跨境电商导航必须具备......
  • django 上下文管理器 get_context_data 使用
    在Django中,序列化器(serializer)是用于处理数据的序列化和反序列化的类。而get_context_data()方法是用于获取视图上下文数据的方法。默认情况下,序列化器无法直接拿到get_context_data()中的内容。如果你希望将get_context_data()中的内容传递给序列化器进行处理,可以通过以下几种方......
  • "快速访问"(Quick Access)是 Windows 操作系统中一个常用的功能,它允许用户快速访问最近
    "快速访问"(QuickAccess)是Windows操作系统中一个常用的功能,它允许用户快速访问最近使用的文件和常用的文件夹。它在资源管理器中的左侧导航窗格中显示,并提供了便捷的方式来查找和打开文件。在Windows10中,"快速访问"默认显示用户最近访问的文件和常用的文件夹。它会根据用户......
  • Vue 基本认识二:使用 Vue CLI 的 Vue 项目
    注意VueCLI(手脚架)创建项目需要安装Node.js,没安装的看这里。使用VueCLI创建与运行项目,看这里。VueCLI创建的项目文件夹和文件说明,看这里。 单文件组件定义和引入  render函数......
  • "system32/secpol" 是指位于Windows操作系统的system32文件夹下的一个名为secpol.msc
    "system32/secpol"是指位于Windows操作系统的system32文件夹下的一个名为secpol.msc的文件。该文件是本地安全策略管理器(LocalSecurityPolicy)的主控制台。它允许用户管理和配置计算机的安全策略。本地安全策略管理器提供了一系列安全设置,可以帮助管理员保护系统免受未经授权的......
  • 收集整理的对#!bin/sh的认识
    第一次学shell编程,看的文章中说shell程序必须以"#!/bin/sh"开始,也就认为是这样了。虽然知道在shell中以"#"开始的语句都是注释,但也从没认为"#!/bin/sh"也是注释,就像对C语言程序必须有main函数一样毫无怀疑。但前些时候又听说"#!/bin/sh"也是注释,可有可无,当时觉得真是一个失败,连......
  • 认识soui4js(第三篇):使用C/C++开发扩展模块
    首先需要明确:JS代码本身不具备直接调用系统API的能力,JS代码能调用什么功能,都依赖于其它扩展模块提供了什么样的接口。soui4js模块将soui的界面能力作为一个js模块导出到了js中,使得js可以和C++一样操作GUI。但是操作GUI只是一个客户端APP的一个需求。一个产品可能会有各种需求是......
  • 适用于MacOS的多合一压缩包管理器Bandizip
    macos解压缩软件哪款好?这里为大家推荐一款智能多合一压缩包管理器Bandizipformac,该软件提供具有拖放功能的直观界面,使创建和提取档案变得容易。它还支持多核处理,这意味着它可以快速高效地处理大型档案。 Bandizip的应用界面设计更加扁平,但并不意味着它有多好的设计感,即便你......
  • Python进阶-上下文管理器
    上下文管理器定义包装任意代码确保执行的一致性语法with语句__enter__和__exit__方法classContextManager(object):def__init__(self):self.entered=Falsedef__enter__(self):self.entered=Truereturnself......