当前位置: 首页 > news >正文

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。

相关文章:

npm install 的原理

1. 执行命令发生了什么 ? 执行命令后,会将安装相关的依赖,依赖会存放在根目录的node_modules下,默认采用扁平化的方式安装,排序规则为:bin文件夹为第一个,然后是开头系列的文件夹,后…...

基于I2C协议的OLED显示(利用U82G库)

目录 一、I2C协议 1、了解I2C协议的基本原理和时序协议 基本原理 时序协议 2、掌握0.96寸OLED屏的工作原理,汉字点阵显示原理 OLED 工作原理 汉字点阵显示原理 3、掌握开源GUI库U82G在stm32上的移植编译方法,以及图形界面可视化技术。 二、具体…...

【文末附gpt升级秘笈】探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章

探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章 摘要 随着人工智能技术的飞速发展,大模型成为了业界关注的焦点。然而,大模型并非万能,其背后隐藏着诸多迷思与挑战。本文基于“AGI技术50人”访谈栏目的素材&…...

国内12寸先进封装厂家的一些情况

一、12寸先进封装厂家 在中国大陆,专注于12英寸(300mm)晶圆的先进封装技术的企业包括但不限于以下几家: 1. 长电科技(JCET Technologies Co., Ltd.):长电科技是中国领先的半导体封装测试企业之…...

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279 需强化知识点 python 的幂次计算, 10 ** 5, 10 **(0.5) 题目 卡码 57. 爬楼梯(第八期模拟笔试) 注…...

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架,因此C的语法和数据类型在Qt中都是被支持的,但是Qt中也是定义了一些属于自己的数据类型,不过,好多数据类型都是对C的数据类型进行封装,下面来简要介绍一下这些基…...

【源码】Spring Data JPA原理解析之事务执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...

第十一篇——信息增量:信息压缩中的保守主义原则

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 通过信息中的保守主义,我想到了现实中人的保守主义一样&#…...

中国飞行器设计创新大赛多旋翼无人机任务飞行

源码&#xff1a;后续补充 1、启动launch文件 roslaunch robot_bringup mission.launch <launch> <!--启动mavros节点 --><include file"$(find mavros)/launch/px4.launch" /><!--启动USB摄像头节点 --><include file"$(find…...

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…...

武忠祥17堂课没必要全听,这几个才是精华!

作者&#xff1a;Captain 链接&#xff1a;https://www.zhihu.com/question/381665751/answer/3197724055 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 17堂课类似于习题课&#xff0c;是专题训练 17堂课省略了…...

Android 蓝牙profile的配置

在做BQB认证之前&#xff0c;我们需要确认那些profile之前&#xff0c;我们需要查看profile的配置情况 Android13版本前蓝牙profile的配置 MTK的项目代码如下 vendor\mediatek\proprietary\packages\modules\Bluetooth\android\app\res\values\config.xml 高通的项目代码如…...

Selenium时间等待_显示等待

特点&#xff1a; 针对具体元素进行时间等待 可以自定义等待时长和间隔时间 按照设定的时间&#xff0c;不断定位元素&#xff0c;定位到了直接执行下一步操作 如在设定时间内没定位到元素&#xff0c;则报错&#xff08;TimeOutException&#xff09; 显示等待概念&#x…...

41 mysql subquery 的实现

前言 sub query 是一个我们经常会使用到的一个 用法 我们这里 看一看各个场景下面的 sub query 的相关处理 查看 本文, 需要 先看一下 join 的相关处理 测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致 CREATE TABLE tz_test (id int(11) unsigned NOT NUL…...

钉钉二次开发-企业内部系统集成官方OA审批流程(三)

书接上回&#xff0c;本文主要分享 企业内部系统集成钉钉官方OA审批流程的步骤 的第二部分。 前端代码集成钉钉免登JSAPI: 前端通过corpid 获得钉钉临时访问码code&#xff0c;再通过临时访问码code调用此接口返回当前用户的姓名、userid、 钉钉用户id、 系统工号、 钉钉部门…...

代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0 )return true;if(t.size()0)return false;vector<vector<int>> dp(s.size(…...

C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 30. 外观模式 为子系统定义一组统一的接口&#xff0c;这个高级接口会让子系统更容易被使用。应用&#xff1a;如在游戏开发中&#xff0c;游戏引擎包含多个子系统&#xff0c;如物理、渲染、粒子、UI、音频等。可以使用外观…...

嵌入式软件测试相关分析

嵌入式软件测试相关分析 1. 引言 在软件发展之初&#xff0c;上个世纪五六十年代&#xff0c;软件被视为数学领域&#xff0c;编程是为了进行数学计算&#xff0c;由数学公式推导&#xff0c;来写函数。因此&#xff0c;在那个时候所编写的程序是被视为数学问题&#xff0c;数…...

vue+jave实现文件报表增加文件下载功能

需求背景:系统有文件交互功能。但没有做页面展示。为了测试方便&#xff0c;写了报表展示并可下载文件做检查。(所以下载是依赖表数据的) 使用语言和框架: 前端:vue-cli 后端:springBoot 前端实现 1、在报表vue文件&#xff0c;显示下载按钮并实现下载接口请求和处理。 //报…...

网站安全性评估方法

评估一个网站的安全性是一个多方面的过程&#xff0c;涉及到对网站的技术架构、代码质量、数据处理、用户交互等多个维度的考察。以下是一些常用的评估方法&#xff1a; 1.了解常见的安全风险&#xff1a;包括恶意软件、钓鱼攻击、跨站脚本攻击等&#xff0c;这些都是网站可能…...

LeetCode 3548. 等和矩阵分割2 详细题解(前缀和+二分+连通性分析)

LeetCode 3548. 等和矩阵分割2 详细题解&#xff08;前缀和二分连通性分析&#xff09; &#x1f3f7;️ 标签&#xff1a;前缀和、二分查找、连通性、哈希表、矩阵、周赛难题 &#x1f4ca; 难度&#xff1a;中等 | &#x1f4dd; 题目编号&#xff1a;3548 | &#x1f5c2;️…...

3个实战场景:League-Toolkit如何帮你提升英雄联盟游戏体验

3个实战场景&#xff1a;League-Toolkit如何帮你提升英雄联盟游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在…...

赶考状元AI学伴的优势是什么:不止于解题,更在于育人

在当今教育数字化战略行动深入推进的背景下&#xff0c;AI与教育的融合已成为发展新质生产力的重要实践。从国家层面看&#xff0c;教育数字化转型正引领着建设教育强国的方向&#xff0c;而AI教育应用也从课程试点逐步走向普及。在这一宏大趋势中&#xff0c;赶考状元AI学伴脱…...

nli-distilroberta-base保姆级教学:从镜像拉取→端口映射→API测试全流程

nli-distilroberta-base保姆级教学&#xff1a;从镜像拉取→端口映射→API测试全流程 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于判断两个句子之间的逻辑关系。这个轻量级模型能够快速准确地分析句子对&…...

无需高配电脑!VMware虚拟机运行Qwen3-TTS声音克隆实测教程

无需高配电脑&#xff01;VMware虚拟机运行Qwen3-TTS声音克隆实测教程 1. 为什么选择虚拟机部署声音克隆&#xff1f; 很多开发者对语音克隆技术感兴趣&#xff0c;但往往被硬件要求劝退。传统认知中&#xff0c;运行1.7B参数量的AI模型需要高端显卡和复杂的环境配置。实际上…...

nli-distilroberta-base商业应用:广告文案与目标人群画像的逻辑契合度评估

nli-distilroberta-base商业应用&#xff1a;广告文案与目标人群画像的逻辑契合度评估 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)服务&#xff0c;专门用于分析两段文本之间的逻辑关系。这个轻量级模型经过蒸馏训练&#xff0c;在保持R…...

JavaScript代码保护实战:用javascript-obfuscator给你的前端穿上防弹衣

JavaScript代码保护实战&#xff1a;用javascript-obfuscator打造坚不可摧的前端防线 1. 为什么前端代码需要保护&#xff1f; 记得去年参与一个电商项目时&#xff0c;团队花三个月开发的核心促销算法&#xff0c;上线一周就被竞争对手完整"借鉴"。检查发现对方直…...

Arduino控制步进电机全攻略:从脉冲计算到加速曲线优化

Arduino控制步进电机全攻略&#xff1a;从脉冲计算到加速曲线优化 引言&#xff1a;为什么需要精准控制步进电机&#xff1f; 在创客和嵌入式开发领域&#xff0c;步进电机因其精准的开环控制特性而广受欢迎。不同于普通直流电机&#xff0c;步进电机能够通过精确控制脉冲数量来…...

跨平台实战:Windows与macOS下OpenClaw对接nanobot的差异详解

跨平台实战&#xff1a;Windows与macOS下OpenClaw对接nanobot的差异详解 1. 为什么需要关注跨平台差异 上周我在团队内部推广OpenClaw时&#xff0c;遇到了一个典型问题&#xff1a;同样的nanobot对接流程&#xff0c;在Windows和macOS上执行时出现了完全不同的行为。这让我意…...

OpenClaw压力测试:Qwen3-VL:30B在飞书中的并发处理能力

OpenClaw压力测试&#xff1a;Qwen3-VL:30B在飞书中的并发处理能力 1. 为什么需要测试个人场景下的并发能力&#xff1f; 上周我在飞书群里部署了一个基于OpenClawQwen3-VL:30B的智能助手&#xff0c;原本只是想让同事帮忙测试基础功能。没想到午休时间突然有十几个人同时机器…...