npm install中的缓存和资源拉取机制
npm config list //查看基本配置npm config list -l //查看所有配置npm@5和之前的版本在缓存存储和使用上有所变化。新版已替换了旧的缓存方法,不再使用之前的npm缓存。不过如果不做离线安装的话,日常使用是无感知的。缓存目录npm install或npm update命令,从 远程仓库下载压缩包之后,都存放在本地的缓存目录。在 Linux 或 Mac 默...
npm@5和之前的版本在缓存存储和使用上有所变化。新版已替换了旧的缓存方法,不再使用之前的npm缓存。不过如果不做离线安装的话,日常使用是无感知的。
缓存目录
npm install或npm update命令,从 远程仓库下载压缩包之后,都存放在本地的缓存目录。
在 Linux 或 Mac 默认目录是${user.home}/.npm,在 Windows 默认是${user.home}/AppData/Roaming/npm-cache。
通过配置命令,也可以直接查看缓存的具体位置。
npm config get cache
# $HOME/.npm
缓存的包就放在.npm/_cacache目录下,该目录下的content-v2 目录用于缓存具体包的内容,index-v5目录用于存储依赖包的 hash。 npm 在执行安装时,可以根据 package-lock.json 中存储的 integrity、version、name 生成一个唯一的 key 对应到 index-v5 目录下的缓存记录,从而找到依赖包的 hash,然后根据 hash 去缓存目录下找到具体包的内容。
缓存机制
npm@5对npm install 的缓存机制进行了重写,--cache-min和--cache-max 是早期npm推出的缓存策略,在V5版本已被deprecated。
--cache-min和--cache-max的问题(摘自 阮一峰博客):
如果指定模块不在缓存目录,那么
npm会连接registry,下载最新版本。这没有问题,但是如果指定模块在缓存目录之中,npm也会连接 registry,发出指定模块的etag,服务器返回状态码304,表示不需要重新下载压缩包。如果某个模块已经在缓存之中,但是版本低于要求,
npm会直接报错,而不是去registry下载最新版本。
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命令,它将对你的缓存进行垃圾回收,减少不需要的东西占据的磁盘使用量,并且会对索引和内容进行全面的完整性验证。
参考
v5.0.0发布说明
npm 模块安装机制简介
npm-config
作为前端工程师你真的知道 npm install 原理么?
更多推荐
所有评论(0)