npm的内部机制与核心原理

256 阅读2分钟

npm的安装机制

image.png

  1. 执行 npm install 命令之后,首先检查config文件,获取npm 的配置,这里的优先级为:项目的.npmrc文件 > 用户级的.npmrc文件 > 全局的.npmrc文件 > npm内置的.npmrc文件
  2. 检查项目中有无lock文件(package-lock.json)
  • 有:检查lock文件与package.json文件的版本是否一致
          一致:直接使用lock文件中的信息,从缓存或者网络中加载依赖
          不一致:根据npm 的版本进行处理,不同的npm版本处理方式不一样
    
  • 没有:根据package.json文件递归构建依赖树,根据依赖树下载依赖,下载时会检查缓存
          有缓存:将缓存内容解压到node_modules中
          无缓存:从npm远程仓库中下载资源包,检查包的完整性,并将其添加到缓存里面,同时解压到node_modules文件中
    
  1. 最后生成lock文件

ps:pnpm与npm的区别之一就是在构建依赖树时pnpm会自动去除幽灵依赖

npm的缓存机制

   先找到npm-cache文件夹(npm config get cache)
   

image.png

在npm-cache文件夹里面的_cacache文件夹中有三个文件(重要的两个:content-v2,index-v5)

  1. content-v2里面存放的是一些二进制文件,将这些文件的后缀名改为 .tgz 再解压得到的结果其实就是npm的包资源
  2. index-v5中存放的是一些描述性文件,其实就是content-v2文件的索引

缓存是如何被存储利用的?

  1. 执行npm install 时会通过pacote将相应的包资源解压在对应的node_modules下,下载依赖时会将依赖下载到缓存中再解压到项目的node_modules下。
    
  2. 每次安装资源时会根据lock文件中存储的 integrity、version、name 信息生成一个唯一的key,这个key对应inde-v5下的缓存记录,如果发现有,则会找到tar包的hash值,根据hash值找到缓存的包,并通过pacote将对应的二进制文件解压到对应的node_modules下,省去下载资源的时间
    

清除缓存:npm cache clean --force