了解一下npm i的流程与原理

流程

执行npm install,先判断有无lock文件。

1、没有lock文件。会先根据依赖构建出扁平的依赖关系决定下哪些包。新版本的依赖关系是扁平化的,老版本是树结构,可能会出现依赖重复安装的问题,老版本示意图如下:

图来自https://zhuanlan.zhihu.com/p/128625669
作为前端工程师你真的知道 npm install 原理么? - 知乎

 

新版本示意如下:

img
作为前端工程师你真的知道 npm install 原理么? - 知乎

        构建出依赖关系会进入下包的操作。下包时会先去找缓存,缓存有符合条件的版本就直接用,没有就去registry仓库下载压缩包,然后将压缩包添加到缓存并解压到node_modules中,完成安装,最后会生成lock文件(指定一个确定的版本)。

        2、有lock文件,先检查依赖的一致性,即lock的当前版本是否符合依赖的版本要求,比如package.json的版本要求是~4.2.3,但是lock的版本是4.1.5,这样次版本就不符合要求,需要重新构建依赖关系后再下包,在下包时同样要先检查缓存。如果lock的版本符合要求就直接进行下包(也是先用缓存)的流程。

流程图如下:

版本号规则

        比如:^x.y.z  其中x代表主版本,不一定兼容上一版本;y代表次版本;z代表修订版本,做一些小的需求更改。其中^代表主版本不变,次版本和修订版本用最新的。

        ~x.y.z则是代表修订版本用最新的,主次版本不变。

最后

        在代码提交时,最好把lock文件也提交了。lock文件为我们提供一个确定的版本号,在下载包时,npm也会优先去找缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter notebook修改默认存储位置

1. 首先,打开Anaconda Prompt 输入命令: jupyter notebook --generate-config2. 根据刚才命令行输出的结果找到config文件,如图所示 3. 打开文件 ctrl F ,然后输入notebooks and kernels找到对应的内容,在The dire…

Git实现提交代码自动更新package.json版本号

此文章主要讲诉如何通过git提交代码来自动更新我们的版本号,也可以指定固定分支才能更新 只要涉及到package version的项目都可以,例如:Vue、React、Node等等 前提是当前项目已经关联了Git仓库 一、编写我们的Node更新版本逻辑,名…

Qt与编码

ASCII码:一个字节&#xff0c;256个字符。 Unicode:字母&#xff0c;汉字都占用两个字节。 utf-8:字母一个字节&#xff0c;汉字3个字节。 gbk:字母一个字节&#xff0c;汉字2个字节。 gb2312:可以表示汉字&#xff0c;gb2312<gbk。 编码查看&#xff1a; https://www.…

实时通讯技术实现

实时通讯技术实现 前言 在CS架构中&#xff0c;经常会有实时通信的需求。客户端和服务端建立连接&#xff0c;服务端实时推送数据给客户端。本文介绍几种常见的实现方式&#xff0c;希望能给读者们一点点参考。 实时通讯的主要实现技术 长轮询(Long Polling) WebSocket 服务器发…

C++初阶篇----内存管理

目录 引言1. 内存分布2.C动态内存管理方式&#xff1a;malloc/calloc/realloc/free3. C动态内存管理:new和delete3.1内置类型3.2 自定义类型 4.operator new与operator delete函数4.1 operator new 与operator delete函数 5. new和delete的实现底层5.1 内置类型5.2 自定义类型 …

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的&#xff0c;使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 二、特性(为什么要用Redis&#x…

如何注册谷歌邮箱gmail

不知道大家在工作生活中有没有需要用到谷歌邮箱的地方&#xff0c;但是最近我就用到了它。因为注册ChatGPT的事&#xff0c;用了outlook&#xff0c;hotmail邮箱注册的gpt账号都被封了&#xff0c;然后通过各方面的了解&#xff0c;发现谷歌的邮箱是没有问题的&#xff0c;不会…

基于springboot的人事管理系统

人事管理系统 摘 要 人事管理系统理工作是一种繁琐的&#xff0c;务求准确迅速的信息检索工作。随着计算机信息技术的飞速发展&#xff0c;人类进入信息时代&#xff0c;社会的竞争越来越激烈&#xff0c;人事就越显示出其不可或缺性&#xff0c;成为学校一个非常重要的模块。…

小狐狸JSON-RPC:钱包连接,断开连接,监听地址改变

detect-metamask 创建连接&#xff0c;并监听钱包切换 一、连接钱包&#xff0c;切换地址&#xff08;监听地址切换&#xff09;&#xff0c;断开连接 使用npm安装 metamask/detect-provider在您的项目目录中&#xff1a; npm i metamask/detect-providerimport detectEthereu…

36-递归与迭代

36-1 用递归和迭代解决问题 1、求n的阶乘 公式&#xff1a; n!123...(n-1)n。用递归方式定义&#xff1a;0!1&#xff0c;n!(n-1)!n。 代码1&#xff1a; 我们先回忆一下之前用循环怎么实现的吧 非递归&#xff0c;也可称迭代&#xff1a; int main() {int n 0;scanf(&q…

书生浦语训练营2期-第一节课笔记

笔记总结: 了解大模型的发展方向、本质、以及新一代数据清洗过滤技术、从模型到应用的典型流程、获取数据集的网站、不同微调方式的使用场景和训练数据是什么&#xff0c;以及预训练和微调在训练优势、通信/计算调度、显存管理上的区别。 收获&#xff1a; 理清了预训练和微调…

Laya1.8.4 UI长按选择对应位置释放技能

需求&#xff1a; 需要实现拖拽摇杆选择技能释放位置&#xff0c;释放技能。 原理&#xff1a;首先拆分需求&#xff0c;分为两部分&#xff0c;UI部分和场景部分&#xff0c;UI部分需要实现长按效果&#xff0c;长按后又要有拖动效果&#xff0c;将官方文档的示例代码改了改…