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 原理么?