Node工程的依赖包管理方式 | 京东云技术团队

news2024/11/18 9:49:31

作者:京东零售 陈震

在前端工程化中,JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源,它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。

目前比较常见的前端包管理器有 npm 和 Yarn,npm 是 Node.js 自带的包管理器,它可以安装、共享和分发 node.js 模块。最近pnpm也挺火的,通过并行下载和安装依赖项,在执行安装、更新、删除等操作时也更快。

但无论使用哪个包管理器,都要通过 package.json 文件的版本控制功能,保证在不同开发环境中的一致性。那么,package.json是如何进行依赖包管理的呢?我们来一起深入了解一下package.json的配置方式。

一、分类管理

image.png
根据package.json规范,依赖包被大致分为以下几种:dependencies、devDependencies、optionalDependencies、peerDependencies和bundledDependencies总共5种。dependencies和devDependencies这两项是我们使用较为频繁的。

1、dependencies

工程在生产环境下也需要使用的依赖,例如react、antd等,使用npm安装插件时,会默认写入dependencies,也可以使用-P或–save-prod后缀。

2、devDependencies

工程只有开发环境需要,生产环境不需要的依赖,例如eslint、babel等,使用-D或–save-dev来写入devDependencies。

3、optionalDependencies

顾名思义,依赖是可选的,它们只有在运行时需要使用某些功能时才会被引入。通常用于实现某些可选的功能或优化。例如,一个包可能依赖于某个库来实现某种高级功能,但是这个库在某些环境下不存在或不可用。在这种情况下,可以将该库声明为可选依赖项,并在代码中检查该依赖项是否存在,然后根据情况来决定是否使用该高级功能。使用这个功能的工程比较少,使用-O或–save-optional来写入optionalDependencies。

4、peerDependencies

工程需要和这个依赖配套使用,一般用于解决插件依赖的核心库的版本和主项目依赖的核心库的版本不一致的问题,常见于开发配套插件。例如vuex@4.1.0声明了:

"peerDependencies": {
   "vue": "^3.2.0"
}

表明vuex@4.1.0需要和vue@^ 3.2.0一起安装和使用,否则可能会出现异常。使用-O或–save-optional来写入optionalDependencies。

5、bundledDependencies

工程依赖于某些特定的依赖项,并且希望在运行时不必再次下载它们,则可以使用该选项。npm pack会将这些依赖一同放入生成的包中,并且在npm install时本工程,这些依赖项也会被一同安装。使用-B或–save-bundle来写入bundledDependencies。

看到这里你可能会有点疑问,为什么npm没有提供类似–save-peer的指令来写入peerDependencies呢?原因是peerDependencies暗示本工程将会被其他主模块使用,但是主模块本身并不需要在项目代码中显式使用。因此官方没有支持这一指令。

二、版本管理

一般情况下,以上依赖配置(除了bundledDependencies)都需要指定依赖的版本号,版本号遵循semver语义化版本规范(Semantic Versioning)命名规则,可以用下图表示,如2.1.0、3.1.4-beta.2等。
image.png

  • 当发生不兼容的 API 修改时,更新major位
  • 当做了向下兼容的功能性新增时,更新minor位
  • 当做了向下兼容的问题修正时,更新patch位

可选的-tags即先行版本号,可以作为发布正式版之前的版本,格式是在修订版本号后面加上一个连接号(-),再加上一连串以点(.)分割的标识符,标识符可以由英文、数字和连接号([0-9A-Za-z-])组成。

在 npm 的依赖的规则中,还有~、>、<、=、>=、<=、-、||、x、X、*等符号来描述适用的版本范围;

  • ^ :表示只锁定major,不小于指定版本号的版本范围。例如^1.1.0,代表>=1.1.0 <2.0.0的版本范围。

  • ~ :表示锁定major和minor,不小于指定版本号的版本号。例如~1.1.0,代表>=1.1.0 <1.2.0的版本范围。

  • x、X、*:表示通配符。例如1.1.x,也代表>=1.1.0 <1.2.0的版本范围。

默认情况下,若指定了一个版本范围,npm会在范围内安装最新版本的依赖。当使用 npm install XX 时,会安装当前最新版本,并在版本号前默认加上 ^ 符号。因此在安装运行老项目时,很容易出现安装依赖后,项目启动报错的情况,原因就是某些依赖没有做到很好的向下兼容,导致重新安装的版本太高造成兼容性错误,此时需要定位错误依赖并回退版本。

三、npm install加载机制

image.png

npm install核心流程大致分为以下5步:

1、npm 向 registry 查询依赖压缩包的网址。
2、下载压缩包,存放在cache目录,供下次安装时使用。
3、解压压缩包到当前项目的node_modules目录。
4、把所有安装的包信息写入package-lock.json,供下次安装时使用。
5、继续处理依赖的依赖。

install的过程速度也和每一个步骤息息相关:
(1)共享工程package-lock.json,可以避免向registry查询的步骤,并且保证不同环境下安装包的一致性。
(2)使用下载速度快的registry镜像(例如jd镜像)。
(3)预先进行依赖关系分析构建依赖关系,然后最后再并行下载(例如yarn)。

希望以上的介绍能够帮助你更好的理解npm的依赖管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp打包app,调用相机功能时在真机调试可以,打包成app之后不行

在打包成app之后报如图所示错误&#xff1a; 解决&#xff1a; 在app模块配置勾选上相机这一项&#xff0c;如图&#xff1a; 这是主要针对上面这个报错的&#xff0c;当然还有一下情况比较类似&#xff0c;就是相机功能在真机调试下可以&#xff0c;打包之后就不行了。我总结…

第九章_Redis哨兵(sentinel)

是什么 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 作用 哨兵的作用&#xff1a; 1、监控redis运行状态&#xff0c;包括master和slave 2、当master down机&#xff0c;能自动将slave切换成…

面试京东失败,再看看两年前的面试题,根本不是一个难度

刚从京东走出来&#xff0c;被二面难到了&#xff0c;我记得学长两年前去面试的时候&#xff0c;问的问题都特别简单&#xff0c;咋现在难度高了这么多。面试前我也刷过很多的题和看过很多资料&#xff0c;后来想想&#xff0c;这年头网上软件测试资料泛滥&#xff0c;软件测试…

Linux使用crontab编写定时任务

Linux使用crontab编写定时任务 安装 yum install -y crontabcrontab服务启动与关闭 service crond start #启动服务 service crond stop #关闭服务 service crond restart #重启服务 service crond reload #重新载入配置 service crond status #查看状态chkconfig crond on …

【广州华锐互动】火电厂3D沉浸式事故体验,提高员工安全意识和应急处理能力

火电厂是一种重要的能源生产方式&#xff0c;但是在运营过程中也存在着一些风险和隐患。为了降低火电厂事故的发生率&#xff0c;提高员工的安全意识和应急处理能力&#xff0c;火电厂3D沉浸式事故体验系统成为了一个重要的工具&#xff0c;为企业安全管理起到了不可替代的作用…

python 第一章——简介与环境搭建

文章目录 前言一、什么是编程语言二、下载python解释器三、安装pycharm 前言 本系列教程目录可点击这里查看&#xff1a;python教程目录 python在当今世界的流行度应该已经不用我多说了&#xff0c;这可以从TIOBE的榜单中可窥一二 作为一门面向编程新人的语言&#xff0c;它…

【无标题】基于K-means聚类的多智能体跟随多领导者算法

源自&#xff1a;系统仿真学报 作者&#xff1a;袁国栋 何明 马子玉 张伟士 刘学达, 李伟 摘 要 为防止多智能体集群跟随多个领导者时编队混乱&#xff0c;提出了3种K-means聚类算法&#xff0c;将集群分成与领导者数量相同的社区&#xff0c;社区内的智能体将跟随同一领导…

解决PDF转Word问题:三种免费转换方法大比拼

在职场办公中&#xff0c;我们经常会遇到将PDF文件转换为可编辑的Word文件的问题。虽然网上有很多PDF转Word工具&#xff0c;但许多工具要么需要付费&#xff0c;要么转换后的文件无法直接编辑。所以&#xff0c;你可能会想知道是否有免费且效果好的PDF转Word工具。在本文中&am…

基于Java+SpringBoot+vue+element疫情药品采购出入库系统设计实现

基于JavaSpringBootvueelement疫情药品采购出入库系统设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

使用opencv进行场景识别

opencv场景识别 文章目录 opencv场景识别一、需求1、现状2、设想 二、模型使用1、opencv dnn支持的功能2、ANN_MLP相关知识3、图像分类模型训练学习4、目标检测模型5、opencv调用darknet物体识别模型 三、模型训练1、现状2、步骤-模型编译3、步骤-模型训练 一、需求 1、现状 …

配置Maven(精简版)

一.下载配置相关版本的maven 1..下载maven文件 maven下载官网&#xff1a;点击 点进去官网&#xff0c;点击Download 往下拉找到这个 下载就可以了&#xff0c;下载完成后找地方解压。 2.配置环境变量 变量名&#xff1a;MAVEN_HOME 变量值&#xff1a;自己的安装目录 编…

最新,有8本SCIE期刊被剔除,4月SCIESSCI期刊目录更新(附最新目录下载)

2023年4月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次3月WOS期刊目录更新大变动之后&#xff0c;此次4月更新又有8本SCIE期刊发生变动&#xff0c;其中有4本期刊被剔出SCIE数据库&#xff0c;4本期刊更改了名称和ISSN号。更新后的最新SCIE期刊目录共有9505本…

基于51单片机的脉搏测量仪设计与实现

目录 前言 一、设计背景 二、系统功能 三、系统硬件设计 3.1 总体方案设计 3.2 信号采集电路设计 3.3 报警电路设计 3.4 下载电路 3.5 电源电路设计 3.6 OLED显示设计 3.7 键盘电路 四、系统软件设计 4.1 系统主程序设计 4.2 脉搏采集子程序设计 4.3 键盘程序设…

浏览器自动化(一)

目录 介绍 下载地址 安装教程 爬取百度热搜 介绍 Automa 是一个免费、开源的 Chrome 扩展&#xff0c;它通过目前流行的 No Code 无代码方式&#xff0c;只需要拖拽模块就实现了浏览器自动化&#xff0c;比如自动填写表格、执行重复性任务。 在工作中&#xff0c;如果我们…

Nacos单机搭建

Nacos概述 Nacos Nacos是阿里巴巴开源的服务注册中心及配置中心&#xff0c;致力于给开发者提供一款便捷、简单上手的开源框架 Nacos注册中心Eureka 服务配置Config 服务总线Bus 服务发现和服务健康监测 Nacos 使服务更容易注册&#xff0c;并通过DNS或HTTP接口发现其他…

Java企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

Java网络通信

网络通信 网络程序设计是编写与其他计算机进行通讯的程序。Java已经将网络程序所需要的对象封装成不同的类。只要创建这些类的对&#xff0c;使用相应的方法&#xff0c;即使设计人员不具有关的网络知识&#xff0c;也可以编写处高质量的网络通讯程序 现实两台计算机的通信&a…

Activiti基本使用2

目录 3、流程实例 3.1、什么是流程实例 3.2、让实际业务与activiti表关联(BusinessKey) 3.3、挂起&#xff0c;激活流程实例 3.3.1、全部流程实例挂起 3.3.2、单个流程实例挂起 4、任务分配 4.1、固定分配 4.2、表达式分配 4.2.1、UEL-value 4.2.2、UEL-method 方式…

“码”上反馈,自动留痕:二维码助力湖塘街道人居环境巡查高效化

绍兴市柯桥区湖塘街道将农村人居环境巡查同二维码技术相结合&#xff0c;具体应用到了“村民垃圾分类检查”、“公厕卫生检查”和“各村垃圾分类工作的督导记录”这三项检查工作中&#xff0c;做到了“码”上反馈、自动留痕&#xff0c;有效提升了巡检实效&#xff0c;在2020年…

什么是薪酬管理系统,薪酬管理有哪些功能?

阅读本文您将了解&#xff1a;1.薪酬管理系统的定义&#xff1b;2.薪酬管理系统的功能&#xff1b;3.薪酬管理系统的作用。 一、薪酬管理系统是什么 薪酬管理系统是一种用于管理企业员工的薪资和奖金的工具。它可以自动计算员工的工资和奖金&#xff0c;记录员工的考勤和休假…