返回顶部
首页 > 资讯 > 精选 >Node包管理发展的阶段有哪些
  • 665
分享到

Node包管理发展的阶段有哪些

2023-07-04 21:07:39 665人浏览 薄情痞子
摘要

本文小编为大家详细介绍“node包管理发展的阶段有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node包管理发展的阶段有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。阶段一:刀耕火种正确来说,Node

本文小编为大家详细介绍“node包管理发展的阶段有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node包管理发展的阶段有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

阶段一:刀耕火种

正确来说,Node是不存在没有包管理器时期的,2009年,node.js 问世时 npm的雏形也发布了。

npm 全称 Node.js Package Manager;从A brief history of Node.js 里面可以看到

2009 Node.js is born The first fORM of npm is created

下面聊一下没有出现Node包管理器时期是怎样的,那时候做的更多的事情就是

  • 网上寻找各软件的官网,比如 Jquery

  • 找到下载地址,下载 zip 包;

  • 解压,放到项目中一个叫 libs 的目录中;

  • 想更方便的话,直接将 CDN 链接粘贴到 html

那时候 模块化管理?版本号管理?依赖升级?都不存在的!

阶段二:嵌套安装

2009 年,Node.js 诞生,npm的雏形也正在酝酿,2011年发布了 1.0 版本;npm是围绕着语义版本控制 semver 的思想而设计的,默认认为Node包开发者,在升级依赖包自定义版本号时,都会按照 semver 规范升级版本号。

代名词: Node包管理规范化、node_modules 目录嵌套存放依赖

代表产物: npm v1、v2 版本

关键特点:

(1)依赖包嵌套安装,相同版本的依赖会被冗余安装

(2)依赖包安装不确定性:默认装最新次版本的依赖包(可设置固定版本)

(3)串行安装依赖,速度慢;不支持离线缓存

解释1:依赖 嵌套安装 ,如果A依赖B、B依赖C,node_modules目录如下

node_modules- package-A-- node_modules--- package-B----- node_modules------ package-C-------- some-really-really-really-long-file-name-in-package-c.js

问题: 依赖嵌套过多会造成嵌套地狱,与此同时会出现大量相同依赖包的冗余安装,造成 node_modules 体积过大,需要程序员定期的 rm -rf node_modules,但windows系统,很多程序无法处理超过260个字符的文件路径名,早期 npm 的 windows 用户都见过这个弹窗

Node包管理发展的阶段有哪些


解释2:针对每次 npm install 默认安装最新次版本依赖,造成的依赖安装 不确定性 问题:

semver 规范了版本号构成:X.Y.Z-[state],版本号升级规范如下

  • X 是主版本号: api 产生的变化,与旧版本不兼容时,升级主版本号

  • Y 是次版本号: 增加了新的API,但向后兼容,升级次版本号

  • Z 是补丁版本号: 当做了向后兼容的缺陷修复的时候

  • state 可以是:alpha(内测)、beta(公测)、gamma(相当成熟的测试版)、rc(预发布)

版本不确定原因:执行 npm 默认安装依赖指令时,npm 认为开发者都会遵循 semver 版本升级规范,直接给开发者安装 了最新次版本的依赖包

  • 解决方案1:可以通过npm config set save-exact true命令关闭在版本号前面使用 ^的默认行为

  • 总结:无法解决依赖库自己的依赖默认安装最新次版本的问题

  • 解决方案2:npm提供了 shrinkwrap 命令,会生成一个 npm-shrinkwrap.JSON 文件,为所有库和所有嵌套依赖的库记录精准的版本

  • 总结:文件不会默认生成,需要用户手动执行指令;依赖于用户知道这个指令,相对繁琐

阶段三:扁平化安装

2015年,为解决 npm1、npm2 存在的 嵌套安装、版本不规定问题,完全重写了 npm 程序

代名词: 较少冗余依赖的安装、node_modules 目录扁平化存放依赖

代表产物: npm v3版本

原理简述: npm install时,先构建依赖树再将所有依赖都安装在 node_modules 根目录,子依赖遇到不同版本的重名依赖时,会将子依赖安装在自己node_modules下

关键特点:

(1)减少冗余安装:依赖扁平化安装,一定情况下减少了冗余包的安装

存在的问题

(1)“幽灵依赖”、“幻影依赖” 问题

(2)“双胞胎陌生人” 、“依赖包分身” 问题

(3)目录不固定:依赖的安装顺序,决定了 node_module 目录结构

解释1:依赖的依次安装顺序,决定了node_modules 目录结构

如下场景: App1 依赖 packageA 和 packageC 和 packageG 和 packageH,而 packageA 和 packageC 都依赖了 packageB v1.0,packageG、packageH 都依赖 packageB 的 v2.0 版本

如果先安装 packageA 或 packageC,node_modules 目录如下

Node包管理发展的阶段有哪些

如果先安装 packageG 或 packageH,node_modules 目录如下

Node包管理发展的阶段有哪些

针对如上情况,npm 提供了指令 npm dedupe,可以手动整理&简化 node_modules 的目录结构,整理后的 node_modules 目录结构是一致的,不受依赖包安装顺序影响

解释2:不一定能减少冗余包的安装

通过举例1,可以看出虽然依赖包扁平化安装,但仍存在相同版本的依赖包,有冗余包

解释3:“双胞胎陌生人” 问题

参考举例1中,相同版本的依赖包,被安装两次,被放置到两处,这种现象被称为“双胞胎陌生人”

解释4:“幽灵依赖” 问题

node_modules 一级目录下的依赖包,开发者可以直接使用,但依赖包没定义在 package.json 中,这样的依赖包被称为 “幽灵依赖”,前端项目中使用 “幽灵依赖”,后期可能会出现问题。

因为后期可能伴随着 其他依赖的升级移除了这个“幽灵依赖”,此时 node_modules 中就不存在了,执行 npm install 时,并不会主观的去安装 “幽灵依赖”,导致项目找不到依赖包,然后报错。

阶段四:安全、提速

2016年,yarn、pnpm release 版本相继出现,在一定程度上解决了之前的 安装版本不确定、安装速度慢等问题,yarn 率先推出的能力相比于 npm,更夺人眼球,保证了一致性&安全性,提升了安装速度

代名词: 依赖安装相对安全、提速

代表产物: yarn release版本、pnpm release版本、npm v5 版本(npm v4没有太大变化,v5向前迈了一大步)

关键特点:

(1)安全:默认生成版本锁文件,保证了每次安装依赖版本都一样

(2)提速:增加了缓存离线安装、并行安装、安装异常后自动重试

(3)workspace:yarn从v1版本开始支持,可以高效管理多个项目的依赖包;npm v7才支持 workspace

存在的问题

(1)幽灵依赖

(2)依赖包单项目重复安装、跨项目重复安装

(3)目录不固定:依赖的安装顺序,决定了 node_module 目录结构

解释1:关于安全

yarn v0.x 版本率先、npm v5.x 版本紧跟其后,下载依赖时,默认生成 依赖锁文件,精确地将版本锁定在一个值

  • yarn 的 .lock 文件:只是记录安装的依赖版本,需要结合 package.json 来确定 node_modules 目录结构

  • npm 的 .lock 文件:记录了安装的依赖版本 及 node_modules 目录结构

总结: 避免了不同终端安装依赖时版本不一致问题,但“依赖幽灵” 问题仍然存在

解释2:关于提速 - 离线缓存

npm v2版本 就支持了缓存,但需要联网检测,才能使用 缓存的依赖

yarn v0.x版本 率先支持了 离线缓存,从网络下载的包都会缓存到全局,下次安装优先从本地找,找到直接copy

npm v5版本 重写了缓存系统,也支持了离线安装,安装速度大大提升

解释3:关于提速 - 并行安装

yarn 率先支持了依赖包并行安装,此前 npm 串行安装依赖,后来 npm 也优化了并行安装

解释4:安装依赖后,自动整理 node_modules 目录

起始时间:yarn v1.x 版本、npm v4.x 版本

  • 如果项目中删除了 .lock 文件,初始化安装依赖时,会自动整理 node_modules 目录;npm v4.x之前版本,需要用户手动执行指令 npm dedupe整理依赖目录

  • 由于 node_modules 是扁平化管理依赖,深层依赖可能会被安装到一级目录下;当项目中再安装不同版本的依赖时,遇到依赖版本冲突,会自动将深层依赖从一级目录移动到父依赖目录下 【已验证】

阶段五:更安全、高速、低耗

对着 pnpm 的成熟,开发者们享受着 pnpm 带来的 更安全、更高速、存储更低耗 等红利,解决了“幽灵依赖” 问题,解决了重复依赖问题

代名词: 安全(依赖安装所见即所得)、高速(不重复安装)、存储低耗(硬链接 + 软链接)

代表产物: pnpm

关键特点:

(1)速度极快:存储中心集中管理依赖,直接硬链接到项目的 node_modules/.pnpm 中。相比于之前的工作方式,减少了从全局 node_modules copy 到项目内的大量 io 操作

(2)磁盘利用率极高

  • 跨项目共用相同版本的依赖:硬链接、软链接

  • 最大限度的复用同一依赖的不同版本:只增加存储不同版本的 Diff 文件

(3)安全性高:node_modules 目录结构就是 package.json 依赖列表,解决了 “幽灵依赖” 问题

Node包管理发展的阶段有哪些

性能表现如下:

Node包管理发展的阶段有哪些

读到这里,这篇“Node包管理发展的阶段有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Node包管理发展的阶段有哪些

本文链接: https://www.lsjlt.com/news/347483.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node包管理发展的阶段有哪些
    本文小编为大家详细介绍“Node包管理发展的阶段有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node包管理发展的阶段有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。阶段一:刀耕火种正确来说,Node...
    99+
    2023-07-04
  • 一文聊聊Node包管理发展的五个阶段
    从2009年 Node 诞生至今,Node 生态发展繁荣,围绕 Node 生态衍生出的 Node 包管理器百花齐放,先后出现了 npm、kpm、pnpm、yarn、cnpm 等等。实际上 Node 包管理器发展主要分5个阶段,下面我们一起看...
    99+
    2023-05-14
    包管理 node
  • 数据管理的发展过程分为哪三个阶段
    这篇文章主要介绍数据管理的发展过程分为哪三个阶段,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据管理的发展过程分为三个阶段。人工管理阶段数据不保存在计算机内。没有专用软件对数据进行...
    99+
    2024-04-02
  • linux有哪些包管理
    今天小编给大家分享一下linux有哪些包管理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。8种常用包管理有:1、DPKG,D...
    99+
    2023-07-02
  • Python开发工程师的学习阶段有哪些
    本篇内容介绍了“Python开发工程师的学习阶段有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python学习的几个阶段了解Pytho...
    99+
    2023-06-02
  • python包管理器有哪些
    这期内容当中小编将会给大家带来有关python包管理器有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;...
    99+
    2023-06-14
  • golang包管理的方法有哪些
    Go语言的包管理主要有以下几种方法: go mod:自从Go 1.11版本引入了go mod,它成为了Go语言默认的包管理工具。...
    99+
    2024-02-29
    golang
  • react生命周期的阶段有哪些
    今天小编给大家分享一下react生命周期的阶段有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • node.js事件队列的阶段有哪些
    本篇内容主要讲解“node.js事件队列的阶段有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node.js事件队列的阶段有哪些”吧! ...
    99+
    2024-04-02
  • Flex事件机制的阶段有哪些
    这篇文章主要为大家展示了“Flex事件机制的阶段有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex事件机制的阶段有哪些”这篇文章吧。Flex事件机制中的基本概念event object...
    99+
    2023-06-17
  • mysql数据存储的阶段有哪些
    这篇文章给大家分享的是有关mysql数据存储的阶段有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。人工管理阶段:人工管理,没有固定的格式和存储方法,容易混淆。文件管理阶段:数据可长期保存,数据存储量大,使用方...
    99+
    2023-06-25
  • vue的生命周期有哪些阶段
    这篇文章主要讲解了“vue的生命周期有哪些阶段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的生命周期有哪些阶段”吧!有4大阶段:1、初始化阶段,包含beforeCreate(创建前)...
    99+
    2023-07-04
  • 计算机网络发展的第三个阶段是哪个
    这篇文章给大家分享的是有关计算机网络发展的第三个阶段是哪个的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。计算机网络发展的第三个阶段是计算机网络标准化阶段。计算机网络是实现资源共享和信息传递的计算机系统,它的功能有...
    99+
    2023-06-15
  • golang包管理工具有哪些
    golang中的包管理工具有:1.go mod,golang1.11版本中的官方包管理工具;2.govendor,golang的依赖包管理工具;3.godep,golang官方的依赖管理工具;4.Module,golang官方提供的包管理工...
    99+
    2024-04-02
  • PHP应用开发中的NPM包管理技巧有哪些?
    随着JavaScript在Web开发中的广泛应用,Node.js的出现使得JavaScript也可以用于后端开发。而NPM(Node Package Manager)则成为了Node.js的重要组成部分,提供了丰富的第三方包和模块,方便开...
    99+
    2023-09-10
    npm bash spring
  • Linux常用的包管理器有哪些
    常见的 Linux 包管理器有以下几种: APT (Advanced Package Tool):Debian 及其衍生发行版(...
    99+
    2024-03-06
    Linux
  • PHP拓展的实现手段有哪些
    本文小编为大家详细介绍“PHP拓展的实现手段有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP拓展的实现手段有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。关于 PHP 扩展的几种实现手段php 原...
    99+
    2023-06-29
  • Linux通用的跨发行版软件包管理器有哪些
    这期内容当中小编将会给大家带来有关Linux通用的跨发行版软件包管理器有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言Linux系统上的软件包管理可能非常令人困惑,尤其是对于新手,因为不同的Lin...
    99+
    2023-06-15
  • python依赖包管理的方法有哪些
    Python的依赖包管理有以下几种方法:1. Pip:Pip是Python官方推荐的包管理工具,可以通过命令行使用pip来安装、卸载...
    99+
    2023-09-23
    python
  • Linux中常用的包管理器有哪些
    本篇内容介绍了“Linux中常用的包管理器有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!DPKG (Debian 包管理系统)Dpkg...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作