npm的安装机制
-
检查config,获取npm配置,优先级顺序:项目的.npmrc>用户的.npmrc>全局的.npmrc>npm内置的.npmrc
-
检查项目中是否存在package-lock.json,检查package-lock.json和package.json文件声明的版本是否一致
- 一致,使用package-lock.json中的信息,从缓存或网络资源中加载依赖。
- 不一致,根据Npm版本进行处理
-
没有package-lock.json根据package.json文件递归构建依赖树,然后按照构建好的依赖书下载完整的依赖资源,在下载时会检查是否有相关缓存。
- 有缓存,将缓存内容解压到node_modules
- 没缓存,从Npm远程仓库下载包资源,检查包的完整性,并将其添加到缓存,同时解压到node_modules中
-
最后生成package-lock.json
npm缓存机制
npm config get cache
缓存数据存在哪儿?_cacache
image-20240519213108435.png image-20240519213137550.pngcontent-v2 存的二进制文件->npm包资源
index-v5 存放一些描述性文件
其他资料 https://www.pipipi.net/27022.html
npm是如何被存储并被利用的呢
当npm执行时,会通过pacote将相应的包资源解压在对应的node_modules下面。
npm下载时会先将依赖下载到缓存中,再将其压缩到项目的node_modules下。
pacote依赖npm-registry-fetch来下载包资源,npm -registry-fetch可以通过设置cache属性在给定的路径下生成缓存数据
在每次安装资源时,根据package-lock.josn中存储的integrity,version,name信息生成一个唯一的key,这个key能对应到index-v5下的缓存记录。如果发现有缓存记录,就会找到tar包的hash值,根据hash值知道缓存的tar包,并再次通过pacote将对应的二进制文件解压到相应的项目node_modules下,省去网络下载资源时间。(v5版本之后的缓存策略)
npm link/unlink(本质是软连接)
包目录设置npm link,使用包地方设置npm link package-name
npm link做了两件事
- 为目标npm模块创建软链接,将其链接到全局的模块安装路径下
- 为目标npm模块的可执行bin文件创建软链接,将其链接到全局node命令安装路径/user/local/bin/下
npx
解决使用npm时面临的快速开发、调试以及在项目内使用全局模块的问题。
npx执行的是node_modules/.bin下的文件,运行命令时可以自动取node_modules/.bin路径和环境变量里面检查命令是否存在,不需要再package.json中定义script。
npx在执行模块时会优先安装依赖,在安装成功后便删除此依赖。避免了全局安装带来的问题。
部署私有镜像nexus、verdaccio、cnpm
nexus在客户端和外部npm之间,通过group repository合并Npm仓库及私有仓库,这样就起到了代理转发的作用。
网友评论