npm的安装及缓存机制详解

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

npm的安装及缓存机制详解 的相关文章

随机推荐

  • python编程入门书籍-最适合Python初学者的6本书籍推荐「必须收藏」

    原标题 xff1a 最适合Python初学者的6本书籍推荐 必须收藏 Python是一种通用的解释型编程 xff0c 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 xff0c 因为它易于学习和理解 x
  • dubbo好书推荐

    为了自己的进步 xff0c 也为了能够帮助其他人 xff0c 我决定开始写一些东西 xff0c 网上有很多学习资料 xff0c 自己的功力未必到家 xff0c 所以大家共同进步吧 xff01 站在巨人的肩膀上看得远 xff0c 现在推荐一本
  • linux升级java的jdk版本

    这里以升级jdk 8u231 linux x64 rpm为示例 安装 xff0c rpm ivh jdk 8u161 linux x64 rpmrpm pql root jdk 8u161 linux x64 rpm 通过查看 jdk 的信
  • you-get简明使用教程

    前言 近期 xff0c 想要下载哔哩哔哩等网站的视频 xff0c 网上查了一下you get的使用教程和视频 xff0c 有些特别简单 xff0c 说的不求甚解 xff0c 有些讲的太过繁琐 xff0c 所以 xff0c 打算自己写一个简单
  • linux分区扩容(非lvm)

    前言 最近 xff0c 在使用linux中中 xff0c 对于分区空间不够使用的情况下 xff0c 如果是使用lvm的分区 xff0c 是可以使用lvm扩容的 xff0c 流程大概是 xff1a 新加磁盘 将新加的磁盘创建成pv 将新加的p
  • linux关闭virbr0网卡

    前言 最近 xff0c 在使用linux时 要求需要关闭virbr0的网卡 xff0c 网上查了一下virbr0是kvm虚拟机使用的网卡 xff0c 是libvirtd服务安装后 xff0c 自动生成的 xff0c virbr0的配置文件位
  • rsync定时备份数据

    前言 rsync定时备份数据 简介 使用非系统用户备份数据192 168 130 63的 var www html 目录到192 168 130 64的 web bak目录 rsync定时备份数据 实验环境 xff1a 服务器 xff1a
  • rsync+sersync实时同步数据

    前言 rsync 43 sersync实时同步数据 简介 rsync 43 sersync实时同步数据的原理是在客户端安装sersync监控目录的变化 xff0c 一般是增删改 xff0c 检测到变化以后 xff0c 将变化的文件同步到服务
  • 配置 NFS 服务简述

    前言 配置 NFS 服务简述 简介 nfs utils服务依赖于rpcbind的服务 xff0c 是将服务端的目录共享 xff0c 其实是共享的 整个服务端的空间 xff0c 在客户端将共享目录挂载使用即可 配置 NFS 服务简述 实验环境
  • javaweb中四大域对象的生命周期与常用方法

    一 ServletContext 1 生命周期 xff1a 当Web应用被加载进容器时创建代表整个web应用的ServletContext对象 xff0c 当服务器关闭或Web应用被移除时 xff0c ServletContext对象跟着销
  • spring boot 集成 Guava Cache

    Guava Cache 背景集成缓存存放缓存回收 xff1a 基于容量回收 xff08 Size based Eviction xff09 基于时间回收 xff08 Timed Eviction xff09 基于引用类型的回收 xff08
  • 求1~n的阶乘的和,例:1!+2!+3!+......n!

    目录 递归实现 思想 代码实现 非递归实现 思想 代码实现 递归实现 xff1a 利用递归的形式实现阶乘的求和功能 xff0c 但是要注意栈溢出 xff0c 每次递归都会调用 xff0c 都会压栈 xff0c 占用栈中内存 xff0c 如果
  • 如何给shell脚本传入参数小结

    大家都知道普通的bash命令后边可以跟任意的参数 xff0c 那我们自己编写的脚本是否也支持传递参数呢 xff1f 答案当然是肯定的 执行 vim test sh 创建一个新的shell脚本 脚本test sh的内容如下 xff1a bin
  • 使用calibre制作带目录的mobi电子书

    1 把word等格式的书籍转换成txt格式的文件 xff0c 另外再重新把txt文件打开 xff0c 另存为UTF 8格式的文件 2 在想设为目录条目的地方输入 符号 xff0c 一级目录输入一个 xff0c 二级目录输入 3 在每段开头处
  • redis的快照和集群部署

    1 安装 使用redis 3 2 8 tar gz tar zxvf redis 3 2 8 tar gz cd redis 3 2 8 make amp amp make test amp amp make install xff08 1
  • 解决cannot open shared object file: No such file or directory

    一 linux下调用动态库 so文件时提示 xff1a cannot open shared object file No such file or directory 解决办法 xff1a 1 此时ldd xxx查看依赖缺少哪些库 lib
  • Activity的启动模式以及onNewIntent和onConfigurationChanged这两个生命周期方法的场景

    1 Activity的启动模式有哪几种 xff0c 分别用于什么场景 xff1f Activity的启动模式的4种 xff1a standard标准启动模式 xff0c 默认的启动模式 每一次启动这个activity都会创建新的activi
  • node 第三方模块系列------minimist轻量级的命令行参数解析引擎

    总体介绍 xff1a node js的命令行参数解析工具有很多 xff0c 比如 xff1a argparse optimist yars commander optimist和yargs内部使用的解析引擎正是minimist xff0c
  • Python教程:文件路径/目录获取教程

    一 获取文件路径实现 1 获取当前文件路径 span class token keyword import span os current file path span class token operator 61 span file s
  • npm的安装及缓存机制详解

    npm的安装机制 下面我们会通过一个流程图来具体学习npm install的安装机制 npm install执行之后 首先会检查和获取 npm的配置 这里的优先级为 项目级的 npmrc文件 gt 用户级的 npmrc文件 gt 全局级的