npm install的详细过程

npm install的详细过程
  1. 检测依赖项:首先,npm会查看你的项目根目录下的package.json文件,该文件描述了项目所需的依赖项及其版本。npm会解析这个文件并找出所有的依赖项。
  2. 锁定依赖项:在解析完package.json后,npm会生成一个package-lock.json文件。这个文件记录了项目所有依赖项的确切版本,使得每次安装时都能确保相同的依赖项被安装,防止版本不一致的问题。
  3. 从npm仓库下载:然后,npm会查看你指定的每个依赖项的版本,并尝试从npm仓库(默认是npmjs.com)中下载。如果指定了npm镜像,那么将从镜像服务器下载压缩包。
  4. 缓存:从npm5开始,npm引入了缓存机制。下载的压缩包会被缓存,以便下次安装相同版本的依赖项时可以直接从缓存中获取,而无需重新下载。
  5. 解压和安装:下载的压缩包会被解压到项目的node_modules文件夹中。解压后,npm会通过执行每个包的preinstall脚本(如果有的话)进行任何预处理。如果没有preinstall脚本,或者preinstall脚本执行成功,那么npm会进入install阶段。install阶段会执行包的main脚本(如果有的话),这个脚本通常用于执行一些初始化代码,例如引入模块、输出日志等。
  6. 完成:最后,安装过程结束,安装的所有依赖项都在node_modules文件夹中,同时会在package-lock.json中记录下来。
获取模块的过程

获取模块是一个递归的过程,分为以下几步:

  1. 获取模块信息。在下载一个模块之前,首先要确定其版本,这是因为 package.json 中往往是 semantic version(semver,语义化版本)。此时如果版本描述文件(npm-shrinkwrap.json 或 package-lock.json)中有该模块信息直接拿即可,如果没有则从仓库获取。如 packaeg.json 中某个包的版本是 ^1.1.0,npm 就会去仓库中获取符合 1.x.x 形式的最新版本。
  2. 获取模块实体。上一步会获取到模块的压缩包地址(resolved 字段),npm 会用此地址检查本地缓存,缓存中有就直接拿,如果没有则从仓库下载。
  3. 查找该模块依赖,如果有依赖则回到第1步,如果没有则停止。
模块扁平化(dedupe)

获取到的是一棵完整的依赖树,其中可能包含大量重复模块。比如 A 模块依赖于 loadsh,B 模块同样依赖于 lodash。在 npm3 以前会严格按照依赖树的结构进行安装,因此会造成模块冗余。

从 npm3 开始默认加入了一个 dedupe 的过程。它会遍历所有节点,逐个将模块放在根节点下面,也就是 node-modules 的第一层。当发现有重复模块时,则将其丢弃。

这里需要对重复模块进行一个定义,它指的是模块名相同semver 兼容。 每个 semver 都对应一段版本允许范围,如果两个模块的版本允许范围存在交集,那么就可以得到一个兼容版本,而不必版本号完全一致,这可以使更多冗余模块在 dedupe 过程中被去掉。

比如 node-modules 下 foo 模块依赖 lodash@^1.0.0,bar 模块依赖 lodash@^1.1.0,则 ^1.1.0 为兼容版本。

而当 foo 依赖 lodash@^2.0.0,bar 依赖 lodash@^1.1.0,则依据 semver 的规则,二者不存在兼容版本。会将一个版本放在 node_modules 中,另一个仍保留在依赖树里。

举个例子,假设一个依赖树原本是这样:

node_modules
– foo
---- lodash@version1

– bar
---- lodash@version2

假设 version1 和 version2 是兼容版本,则经过 dedupe 会成为下面的形式:

node_modules
– foo

– bar

lodash(保留的版本为兼容版本)

假设 version1 和 version2 为非兼容版本,则后面的版本保留在依赖树中:

node_modules
– foo
– lodash@version1

– bar
---- lodash@version2

如果在安装过程中遇到任何问题(例如网络问题、依赖项冲突等),npm都会有相应的错误处理机制。如果错误无法自动修复,npm通常会停止安装并输出错误信息,提示用户手动解决。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值