npm install 相关过程及分析

1、install 完整流程

1.1、根据 .npmrc 进行安装前环境配置

注意:镜像源就是在这个文件中配置的

优先级:

  1. 每个项目的配置文件(/path/to/my/project/.npmrc
  2. 每个工作区的配置文件(包含 pnpm-workspace.yaml 文件的目录)
  3. 每位用户的配置文件( ~/.npmrc )
  4. 全局配置文件( /etc/npmrc )

1.2、检查有无 lock.json文件

注意:npm/pnpm 检查的是 package-lock.json,yarn检查的是 yarn.lock,cnpm没有对应的lock文件,所以不会进行对比检查

1.2.1、无 lock文件

此时会按照package.json文件,去远程仓库获取依赖包的最新信息(此时并未下载依赖,这是获取依赖包的相关信息

1.2.2、有lock文件

来到重点了,package.json和package-lock.json的冲突,其实咱们现在npm版本估计都在v7左右了,所以不用考虑以前老版本的逻辑,按最新的来:

lock文件中依赖的版本在package.json的版本范围内,没有冲突,则按照lock文件的来,直接跳转步骤1.4。

否则按照package.json的来,有冲突(去远程仓库获取依赖包的最新信息

1.3、构建依赖树

  • 构建依赖树时,不管其是直接依赖还是子依赖的依赖,优先将其放置在 node_modules 根目录。
  • 当遇到相同模块时,判断已放置在依赖树的模块版本是否符合新模块的版本范围,如果符合则跳过,不符合则在当前模块的 node_modules 下放置该模块。
  • 注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包

1.4、检查缓存

1.4.1、无缓存

继续进行后续步骤 1.5

1.4.2、有缓存

跳转步骤到 1.6

1.5、下载依赖包并添加到依赖

去远程仓库下载包,并进行校验,校验未通过则重新下载,校验通过后会将包下载到npm缓存中

1.6、解压到node_modules

1.7、生成lock文件

2、npm缓存策略

在执行 npm installnpm update命令下载依赖后,除了将依赖包安装在node_modules 目录下外,还会在本地的缓存目录缓存一份。通过 npm config get cache 命令可以查询到

缓存目录下又存在两个目录:content-v2index-v5content-v2 目录用于存储 tar包的缓存,而index-v5目录用于存储tar包的 hashnpm 在执行安装时,可以根据 package-lock.json 中存储的 integrity、version、name 生成一个唯一的 key 对应到 index-v5 目录下的缓存记录,从而找到 tar包的 hash,然后根据 hash 再去找缓存的 tar直接使用。

2.1、缓存管理

  • npm cache add:官方解释说这个命令主要是 npm 内部使用,但是也可以用来手动给一个指定的 package 添加缓存。
  • npm cache clean:删除缓存目录下的所有数据,为了保证缓存数据的完整性,需要加上 --force 参数。
  • npm cache verify:验证缓存数据的有效性和完整性,清理垃圾数据。

3、npm ci

npm ci 可以自动删除 node_modules 目录,无法安装单个依赖,且不会改变 package-lock.json 文件,但执行时 package-lock.json 必须存在且版本号与 package.json 要求一致,如果 package.json 中不存在依赖 A 或者依赖 A 版本和 lock 中不兼容,npm ci 就会报错

相对于 npm install 好处,我的理解是:不会主动更新版本,保持依赖在原有可掌握的范围内,这将大大保持所有开发者的统一性。一般情况下,使用npm install足够了,但是要是对依赖版本要求很严格的话,就使用npm ci

4、疑难解答

4.1、90%依赖报错解决方法?

rm -rf node_modules && npm cache clean --force && npm i

4.2、package.json被修改的原因?

  1. 新增或者删除了一些包,但是没有及时 install,比如 a 同学给 package.json 添加了一个 package,但是没有执行 npm install,代码被 push 上去后,b 同学执行 npm i,就会发现 lockfiles 被更改了
  2. 挪动了包的位置,将部分包的位置从 dependencies 移动到 devDependencies这种操作,虽然包未变,但是也会影响 lockfiles,会将部分包的 dev 字段设置为 true
  3. registry 的影响,经过实际使用发现,如果我们 node_modules 文件夹下的包中下载时的的 registry 与 lockfiles 中包即使 version 相同,但是registry是不同,执行 npm i 时也会修改。

4.3、yarn.lock被修改的原因?

  1. 当package.json变化
  2. package.json中的包版本与yarn.lock中的版本不同
  3. 执行yarn add重新安装依赖
  4. 执行yarn upgrade更新所有依赖

 4.4、如何区分版本号呢?

 有童鞋对 版本号中的 ~ ^ 可能傻傻分不清,那林大大就分享下我自己的理解吧,~ 中文名叫波浪号,浪在海边,而海一般都在外面海边,所以是用来限定最后一位的,而 ^  是方向向上指向天空的,可以理解为 中天,所以用来限定中间那位的。位置记好后,再来记一下,这俩符号 都是 代表 大于等于 这个数字,所以是不是就理解到不会忘了呢~

~1.1.1 范围是 [1.1.1, 1.2.0)

^1.1.1 范围是 [1.1.1, 2.0.0)

------有不懂的可以相互讨论交流噢~我有错误的话,请指出噢~------


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

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

相关文章

Mysql事务细节研究(进阶篇)

多碧莉-CSDN博客 文章出处如上 背景:最近由于参加春招面试,回顾此处知识点的时候发现自身有诸多疑问。虽然自己曾经写的文章可以整体的帮助自己快速回忆事物的各种特性,以及各种隔离级别下可能出现的问题和解决方案。但当时的认知浅显&…

Kubernetes基础(十九)-k8s存储对象Persistent Volume Claim

1 什么是Persistent Volume Claim? 在容器编排中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。为了解决这个问题,Kubernetes引入了Persistent Volume(PV)和Persistent Volum…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾: SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾: 【STM32】SP…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 (以上可以自行网上查阅资料) 开始实现 1.注册讯飞星火用户,获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…

【精选】Java面向对象进阶——接口和抽象类的案例

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

【大厂Java面试题】简问简答篇

什么是Java中的内存模型(Memory Model)?请解释一下主内存(Main Memory)和工作内存(Working Memory)的概念。 答:Java内存模型定义了多线程程序中共享变量的访问规则。主内存是所有线程共享的内存区域,而工作内存是每个线程独享的内存区域。 说说Java中的垃圾回收(Gar…

【程序员英语】The Distinctions Between “Yet“ and “But“(英语中“Yet“和“But“的区别)

文章目录 The Distinctions Between "Yet" and "But"("Yet"和"But"的区别)Overview of "Yet" and "But"("Yet" 和 "But" 的概述)Definition of…

scss配置主题

$themes: (light: (font_color: #fff,),dark: (font_color: #000,), );mixin themeify {each $theme-name, $theme-map in $themes {//!global 把局部变量强升为全局变量$theme-map: $theme-map !global;//判断html的data-theme的属性值 #{}是sass的插值表达式//& sass嵌套…

『运维备忘录』之 SSH 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

C++学习:list

1.list的定义和结构 list的使用频率不高,在做题时几乎遇不到需要使用list的情景。list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。list容器以节点(node的形式存储元素,并使用指针将这些节点链接在一起,形成一个…

苹果电脑深度清理工具CleanMyMac X2025中文版

苹果电脑用户们,你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅?可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻,拥有一些高效的深度清理工具就显得尤为重要。今天,我将介绍几款优秀的苹果电脑深度清理工具…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

【Python】【Pycharm】Python Script头文件设置

1、步骤&#xff1a;File->settings->Editor->File and CodeTemplates->Python Script 2、复制粘贴以下代码&#xff0c;应用即可&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*-# Time :${DATE} ${TIME} # Author : admin # Site :${SITE} …

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

unity中实现3D物体在UI前方

在Unity中&#xff0c;如果你想要将3D物体显示在UI的前方&#xff0c;可以通过Canvas和RawImage来实现。以下是一些步骤&#xff1a; 创建Canvas&#xff1a; 在场景中创建一个Canvas对象。你可以在Hierarchy视图中右键点击&#xff0c;选择UI > Canvas&#xff0c;或者在创…

MySQL中year()和month()函数解析与输出示例详解

摘要 在MySQL中&#xff0c;year()和month()函数是用于从日期或日期时间类型的数据中提取年份和月份的常用函数。本文将详细介绍这两个函数的底层逻辑&#xff0c;包括日期格式的识别和相应值的获取&#xff0c;并提供实例和输出结果作为示例。 1. year()函数的底层逻辑 MySQL…

【HarmonyOS】【DevEco ohpm ERROR: NOTFOUND package “@ohos/hypium“如何解决

参考 &#xff1a;&#xff08;无效&#xff09; 华为开发者论坛 DevEco创建项目时的错误解决_6 月 优质更文活动_路北路陈_InfoQ写作社区 解决&#xff1a; HormonyOS-DevEco Studio新建空项目ERROR解决_oh_modules\ohos\hypium-CSDN博客 将 .ohpm文件夹中的hypium文件夹复…

【Node-RED】安全登陆时,账号密码设置

【Node-RED】安全登陆时&#xff0c;账号密码设置 前言实现步骤密码生成setting.js 文件修改 安全权限 前言 Node-RED 在初始下载完成时&#xff0c;登录是无账号密码的。基于安全性考虑&#xff0c;本期博文介绍在安全登陆时&#xff0c;如何进行账号密码设置。当然&#xff…

AI告诉你怎么关闭Windows系统的自动更新的一般步骤——以Windows 10为例

在Windows系统中&#xff0c;彻底关闭自动更新的步骤可能会随着操作系统的版本而有所不同。以下是适用于大多数Windows版本&#xff08;如Windows 10&#xff09;的关闭自动更新的一般步骤&#xff1a; 方法一&#xff1a;使用组策略编辑器 按下 Win R 键打开运行对话框&…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…