npm install 的原理

1. 执行命令发生了什么 ?

执行命令后,会将安装相关的依赖,依赖会存放在根目录的node_modules下,默认采用扁平化的方式安装,排序规则为:bin文件夹为第一个,然后是@开头系列的文件夹,后面是按照文件夹首字母排序的文件夹。

安装依赖时,使用的算法是广度优先遍历,在遍历依赖树时,npm会首先处理项目根目录下的依赖,然后逐层处理每个依赖包的依赖,直到所有依赖都被处理完毕。在处理每个依赖时,npm会检查该依赖的版本号是否符合依赖树中其他依赖的版本要求,如果不符合,则会尝试安装适合的版本。

2. 什么是扁平化?

安装某个二级模块时,若发现第一层级有相同名称,相同版本的模块,便直接复用那个模块。因为A模块下的C模块被安装到了第一级,这使得B模块能够复用处在同一级下相同的C模块。

扁平化只是理想状态,非理想状态如下图所示:

因为B和A所要求的依赖模块版本不同,所以B不能复用A下的C 1.0模块,所以如果这种情况还是会出现模块冗余的情况,他就会给B继续加一层node_modules,就是非扁平化了。

3. 执行命令后续流程

执行命令后续流程具体过程如下图所示:

npmrc的配置如下图所示:

registry=http://registry.npmjs.org/
# 定义npm的registry,即npm的包下载源proxy=http://proxy.example.com:8080/
# 定义npm的代理服务器,用于访问网络https-proxy=http://proxy.example.com:8080/
# 定义npm的https代理服务器,用于访问网络strict-ssl=true
# 是否在SSL证书验证错误时退出cafile=/path/to/cafile.pem
# 定义自定义CA证书文件的路径user-agent=npm/{npm-version} node/{node-version} {platform}
# 自定义请求头中的User-Agentsave=true
# 安装包时是否自动保存到package.json的dependencies中save-dev=true
# 安装包时是否自动保存到package.json的devDependencies中save-exact=true
# 安装包时是否精确保存版本号engine-strict=true
# 是否在安装时检查依赖的node和npm版本是否符合要求scripts-prepend-node-path=true
# 是否在运行脚本时自动将node的路径添加到PATH环境变量中

4. package-lock.json 的作用

这个东西可以锁定版本记录依赖树详细信息。

version 该参数指定了当前包的版本号;

resolved 该参数指定了当前包的下载地址;

integrity 用于验证包的完整性;

dev 该参数指定了当前包是一个开发依赖包;

bin 该参数指定了当前包中可执行文件的路径和名称;

engines 该参数指定了当前包所依赖的Node.js版本范围;

package-lock.json 帮我们做了缓存,他会通过name + version + integrity信息生成一个唯一的key,这个key能找到对应的index-v5 下的缓存记录,也就是npm cache 文件夹下的。

如果发现有缓存记录,就会找到tar包的hash值,然后将对应的二进制文件解压到node_modules。

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

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

相关文章

Linux网络诊断工具mtr命令详解

目录 一、mtr概述 二、mtr的特点 1、动态路由显示 2、数据包类型 3、显示延迟和丢包 4、过滤和日志 5、网络探测 三、基本用法 1、基本语法 2、帮助 3、常用选项 四、输出解释 1、常见mtr命令及其输出 2、输出解释 四、命令实例 1. 最基本的用法 2. 显示报告形式…

SpringBoot 配置事务

SpringBoot 在启动时已经加载了事务管理器,所以只需要在需要添加事务的方法/类上添加Transactional即可生效,无需额外配置。 TransactionAutoConfiguration 事务的自动配置类解析: SpringBoot 启动时加载/META-INF/spring/org.springframewor…

⑤单细胞学习-cellchat组间通讯差异分析

④-1单细胞学习-cellchat单数据代码补充版-CSDN博客 ④-2单细胞学习-cellchat单数据代码补充版(通讯网络)-CSDN博客 参考: 1:单细胞分析之细胞交互-3:CellChat - 简书 (jianshu.com) 2:CellChat细胞通讯…

帕友的小贴士,锻炼

帕金森病作为一种慢性神经系统疾病,对患者的生活质量产生了深远的影响。虽然医学界对于帕金森病的治疗仍在不断探索,但合理的锻炼已经被证实是改善患者症状、提高生活质量的有效途径之一。本文旨在为帕金森病患者推荐一些适合的锻炼方法,帮助…

c#未能加载基类System错误 这台计算机上缺少此项目引用的 NuGet 程序包

拷贝代码到另一台计算机运行,打开Form1.cs报错 首先确认package的框架 如果是472,则更换472的框架 打开项目->xx属性,进行修改 如果框架正确,就是未识别到程序包 可以参考: https://www.cnblogs.com/txwtech/p/1…

WPF真入门教程32--WPF数字大屏项目实干

1、项目背景 WPF (Windows Presentation Foundation) 是微软的一个框架,用于构建桌面客户端应用程序,它支持富互联网应用程序(RIA)的开发。在数字大屏应用中,WPF可以用来构建复杂的用户界面,展示庞大的数据…

day31贪心算法part01| 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

**455.分发饼干 ** 视频讲解 | 力扣链接刚开始想到的&#xff0c;但是这样太暴力了&#xff0c;太笨了 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 胃口g 饼干尺寸sint result 0;sort(s.begin(), s.end());…

后方碰撞预警系统技术规范(简化版)

后方碰撞预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 功能需求功能条件5 显示需求6 指标需求1 系统概述 后方碰撞预警系统RCW(Rear Collision Warning)是在后方车辆即将与自车发生碰撞之前,激活危险警告灯以较高频率闪烁,从而吸引后方驾驶员的注意力,避免…

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…

44【Aseprite 作图】樱花丸子——拆解

1 枝干 2 花朵&#xff1a;其实只要形状差不多都行&#xff0c;有三个颜色&#xff0c;中间花蕊颜色深一点&#xff0c;中间花蕊外的颜色偏白&#xff1b;不透明度也可以改一下&#xff0c;就变成不同颜色 3 丸子 最外层的颜色最深&#xff0c;中间稍浅&#xff0c;加一些高光…

ISO 19115-2:2019 附录 A(规范性附录)一致性

A.1 概述 本文件中的抽象测试套件包括 ISO 19115-1:2014 中通过引用定义的抽象测试套件。符合本文件的元数据应满足 ISO 19115-1:2014 的一致性要求,并应按本文件第 6 章和附录 B 规定提供。用户定义的元数据应按 ISO 19115-1:2014 附录 C 的规定定义和提供。用户定义的元数据…

2024全国大学生数学建模竞赛优秀参考资料分享

0、竞赛资料 优秀的资料必不可少&#xff0c;优秀论文是学习的关键&#xff0c;视频学习也非常重要&#xff0c;如有需要请点击下方名片获取。 一、赛事介绍 全国大学生数学建模竞赛(以下简称竞赛)是中国工业与应用数学学会主办的面向全国大学生的群众性科技活动&#xff0c;旨…

修复损坏的Excel文件比你想象的要简单,这里提供几种常见的修复方法

打开重要的Excel文件时遇到问题吗?Microsoft Excel是否要求你验证文件是否已损坏?Excel文件可能由于各种原因而损坏,从而无法打开。但不要失去希望;你可以轻松修复损坏的Excel文件。 更改Excel信任中心设置 Microsoft Excel有一个内置的安全功能,可以在受限模式下打开有…

非比较排序之计数排序

1. 了解计数排序 计数排序是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时&#xff0c;它的复杂度为Ο(nk)&#xff08;其中k是整数的范围&#xff09;&#xff0c;快于任何比较排序算法。当然这是一…

MySQL数据库的基础:逻辑集合数据库与表的基础操作

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

字符串常量简单介绍

C/C内存四区介绍 如前文所示&#xff0c;字符串常量存储在静态存储区的字符串常量区&#xff0c;这样做的好处是 当程序使用到多个相同的字符串常量时&#xff0c;实际上都是使用的同一份&#xff0c;这样就可以减小程序的体积。注意字符串常量是只读的不能被修改。 如图所示&…

冯喜运:6.11#现货黄金#美原油#行情趋势分析及操作建议

【黄金消息面分析】&#xff1a;随着全球经济的波动&#xff0c;黄金作为传统的避险资产&#xff0c;其价格走势一直备受投资者关注。上周五&#xff0c;美国非农就业报告的强劲表现给美联储降息预期泼了冷水&#xff0c;同时&#xff0c;中国5月份未增持黄金&#xff0c;结束了…

debugger(三):dwarf 文件

〇、前言 事实上&#xff0c;一个成熟的 debugger 是不会利用 break 0xADDR 类似的命令来打断点的&#xff0c;这个需要改进&#xff0c;使得它可以直接利用函数名、行数等来打断点。这就需要生成编译信息&#xff0c;只需要在编译的时候&#xff0c;在目标文件中加以下参数&a…

SQL的执行顺序

1、连接与权限校验&#xff1a; 客户端与SQL服务器建立连接&#xff0c;进行账号认证和权限校验。 2、查询缓存&#xff1a; 服务器首先检查查询缓存&#xff0c;如果命中缓存&#xff0c;则直接返回结果。 3、SQL解析与预处理&#xff1a; 如果没有命中缓存&#xff0c;服务器…

在 Android App 里使用 C 代码 - NDK

原生开发套件 (NDK) 是一套工具&#xff0c;使能够在 Android 应用中使用 C 和 C 代码&#xff0c;并提供众多平台库&#xff0c;可使用这些平台库管理原生 activity 和访问实体设备组件&#xff0c;例如传感器和触控输入。 NDK 可能不适合大多数 Android 编程初学者&#xff…