npm缓存原理解析

3,370 阅读2分钟

缓存命中

npm install或npm update命令,从 registry 下载压缩包之后,都存放在本地的缓存目录:~/.npm/cacache, 里面有三个文件夹

image.png

npm在安装依赖的时候,根据package-lock中具体包的version,name和integrity信息(没有lock只能去请求registry了),用pacote:range-manifest:{url}:{integrity}生成唯一key,通过SHA256得到的hash,去_cacache/index-v5里找对应的文件,就能拿到基本的meta信息缓存了,前四位hash用来分路径 如果依赖信息改变了则生成的hash没有对应缓存信息可以命中,会重新下载再更新缓存

image.png

这个shasum就是tar包的hash,用这个hash去_cacache/content-v2里找到对应的gzip(tgz)缓存,解压缩后得到对应依赖的tar包

缓存机制

npm install在执行的时候,首先构建依赖树,依次安装依赖树中的每个包。

如果缓存中有依赖包,就会向远程仓库确认是否过期(304检查)检查,如果过期,就使用新的返回数据刷新缓存,否则就直接使用缓存中的数据。

另外根据是否离线或失去对目标远程仓库的访问权限,npm还提供了fallback-to-offline模式。该模式使无法访问远程仓库的情况下,npm将直接使用本地缓存。 无论何时离线,npm都会尽可能地回退到缓存中-而不是坚持重试网络请求或失败

此外还提供了新的参数,是用户可以指定缓存使用的策略

--prefer-offline: 将使npm跳过任何条件请求(304检查)直接使用缓存数据,只有在缓存无法匹配到的时候,才去访问网络。这样我们将依赖包添加到项目的过程就会快很多。

例如,npm install express --prefer-offline将现在缓存中匹配express,只有在本地缓存没有匹配到的情况下,才去联网下载。

--prefer-online: 与它将强制npm重新验证缓存的数据(使用304检查),并使用重新验证的新鲜数据刷新缓存。

--offline 将强制npm使用缓存或退出。如果尝试安装的任何内容尚未在缓存中,则它将出现代码错误。

可以通过.npmrc或者npm config set来设置缓存使用的策略。

一个新的npm cache verify命令,它将对你的缓存进行垃圾回收,减少不需要的东西占据的磁盘使用量,并且会对索引和内容进行全面的完整性验证。