npm的安装机制
- 执行 npm install 命令之后,首先检查config文件,获取npm 的配置,这里的优先级为:项目的.npmrc文件 > 用户级的.npmrc文件 > 全局的.npmrc文件 > npm内置的.npmrc文件
- 检查项目中有无lock文件(package-lock.json)
-
有:检查lock文件与package.json文件的版本是否一致 一致:直接使用lock文件中的信息,从缓存或者网络中加载依赖 不一致:根据npm 的版本进行处理,不同的npm版本处理方式不一样 -
没有:根据package.json文件递归构建依赖树,根据依赖树下载依赖,下载时会检查缓存 有缓存:将缓存内容解压到node_modules中 无缓存:从npm远程仓库中下载资源包,检查包的完整性,并将其添加到缓存里面,同时解压到node_modules文件中
- 最后生成lock文件
ps:pnpm与npm的区别之一就是在构建依赖树时pnpm会自动去除幽灵依赖
npm的缓存机制
先找到npm-cache文件夹(npm config get cache)
在npm-cache文件夹里面的_cacache文件夹中有三个文件(重要的两个:content-v2,index-v5)
- content-v2里面存放的是一些二进制文件,将这些文件的后缀名改为 .tgz 再解压得到的结果其实就是npm的包资源
- index-v5中存放的是一些描述性文件,其实就是content-v2文件的索引
缓存是如何被存储利用的?
-
执行npm install 时会通过pacote将相应的包资源解压在对应的node_modules下,下载依赖时会将依赖下载到缓存中再解压到项目的node_modules下。 -
每次安装资源时会根据lock文件中存储的 integrity、version、name 信息生成一个唯一的key,这个key对应inde-v5下的缓存记录,如果发现有,则会找到tar包的hash值,根据hash值找到缓存的包,并通过pacote将对应的二进制文件解压到对应的node_modules下,省去下载资源的时间
清除缓存:npm cache clean --force