npm的安装及缓存机制详解

npm的安装机制

下面我们会通过一个流程图来具体学习npm install的安装机制
在这里插入图片描述

npm install执行之后, 首先会检查和获取 npm的配置,这里的优先级为:
项目级的.npmrc文件 > 用户级的 .npmrc文件 > 全局级的 .npmrc > npm内置的 .npmrc 文件
然后检查项目中是否有 package-lock.json文件

如果有, 检查 package-lock.json和 package.json声明的依赖是否一致:

一致, 直接使用package-lock.json中的信息,从网络或者缓存中加载依赖
不一致, 根据上述流程中的不同版本进行处理

如果没有, 那么会根据package.json递归构建依赖树,然后就会根据构建好的依赖去下载完整的依赖资源,在下载的时候,会检查有没有相关的资源缓存:

存在, 直接解压到node_modules文件中
不存在, 从npm远端仓库下载包,校验包的完整性,同时添加到缓存中,解压到 node_modules中

最后, 生成 package-lock.json 文件
其实, 在我们实际的项目开发中,使用npm作为团队的最佳实践: 同一个项目团队,应该保持npm 版本的一致性。
从上面的安装流程,不知道大家注意到了一点没有,在实际的项目开发中,如果每次都去安装对应依赖时,如果相关的依赖包体积过大或者是依赖于网络,无疑会增加安装的时间成本;那么,缓存在这里的就是一个解决问题的好办法,后面我们会做具体的介绍。

npm的缓存机制

接下来让我们看来一下 npm的对于同一个版本的依赖包是如何进行本地化缓存的
这是npm查看本地缓存的命令:
npm config get cache
在这里插入图片描述从图中我们可以看出npm配置缓存的位置在 /Users/zhaoxxxx/.npm(mac os 的默认的缓存的位置)当中。
在这里插入图片描述

其实你也看到了_cacache的目录有三个文件:

content-v2
index-v5
tmp

其中, content-v2里面存放的是一些二进制的文件。为了使二进制的文件可读,我把文件做了压缩和解压缩处理。
在这里插入图片描述
然后把下面的文件进行解压处理就可以得到我们想要的npm的具体的资源:
在这里插入图片描述
解压结果
在这里插入图片描述
这里推荐一个 the unarchiver 解压缩工具,支持更多的格式,强力推荐。
而在 index-v5文件中呢, 我们使用和刚才一样的操作可以得到一些描述性的文件。
在这里插入图片描述事实上这些内容就是 content-v2 文件的索引。
那么这里我也有一个问题这里的缓存是如何存储并且被利用的呢?
这里就要提一下 npm install的安装机制, 当 npm 执行的时候,通过 pacote 把相应的包解压到对应的 node_modules下面。(这里顺嘴提一句 pacote感兴趣的可以来一起研究一下细节,我目前有点不太能看懂; 大概的思路是结合网络请求和文件读写配置进行本地的缓存写入和生成对应的压缩文件,这里通过对一位大佬文章学习有所得链接)
npm主要有会有三个地方用到 pacote:

当你执行 npm install xxx (这时候会通过 pacote.extract 把对应的包解压到对应的node_modules 下面, pacote源码地址: extract.js)

当你执行 npm cache add xxx (这时候会通过 pacote.tarball 下的 tarballStream往我们之前看到的 _cacache文件下去添加缓存, pacote源码地址: tarballStream

当你执行 npm pack xxx 通过 pacote.tarball 下的 _toFile在当前路径生成对应的压缩文件, 源码地址:_toFile )

当npm下载依赖的时候, 先下载到缓存当中,再解压到我们的项目的 node_modules中。
其实 pacote是依赖 npm-registry-fetch来下载包, npm-registry-fetch 可以通过设置 cache 字段进行相关的缓存工作。
在这里插入图片描述紧接着呢, 我们在每次去安装资源的时候,会根据package-lock.json中的

integrity
verison
name

integrity、verison、name 相关信息会生成一个唯一的key;这个key 就能够对应上 index-v5 目录下的缓存记录; 如果发现有缓存资源,就会去找到 tar 包对应的hash值.
根据 hash再去找缓存中的tar包,然后再次通过 pacote将二进制文件解压缩进我们项目的 node_modules目录中,这样就省去了资源下载的网络开销。
在这里插入图片描述
这里需要注意的是, 这里的缓存策略是在 npm v5开始的,那么在 v5之前呢, 每个缓存模块是在我们之前提到的 ~./npmrc 文件中以模块名的格式直接存储的
存储的格式:{cache}{name}{version}。

文章来源链接:https://juejin.cn/post/7060844948316225572

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值