当前位置: 首页 > 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。

http://www.lryc.cn/news/368980.html

相关文章:

  • 基于I2C协议的OLED显示(利用U82G库)
  • 【文末附gpt升级秘笈】探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章
  • 国内12寸先进封装厂家的一些情况
  • 【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279
  • 【Qt】Qt常见的数据类型
  • 【源码】Spring Data JPA原理解析之事务执行原理
  • 第十一篇——信息增量:信息压缩中的保守主义原则
  • 中国飞行器设计创新大赛多旋翼无人机任务飞行
  • WPF-UI布局
  • 武忠祥17堂课没必要全听,这几个才是精华!
  • Android 蓝牙profile的配置
  • Selenium时间等待_显示等待
  • 41 mysql subquery 的实现
  • 钉钉二次开发-企业内部系统集成官方OA审批流程(三)
  • 代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列
  • C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编
  • 嵌入式软件测试相关分析
  • vue+jave实现文件报表增加文件下载功能
  • 网站安全性评估方法
  • 【小程序】WXML模板语法
  • [数据集][目标检测]厨房积水检测数据集VOC+YOLO格式88张2类别
  • QSlider样式示例
  • 【Linux】进程3——PID/PPID,父进程,子进程
  • 开发常用的组件库
  • 深度解析地铁票务系统的技术架构与创新应用
  • Python集合的基本概念和使用方法
  • 谷歌浏览器124版本Webdriver驱动下载
  • 十大排序
  • 微信小程序学习笔记(1)
  • OpenGauss数据库-6.表空间管理