npm install 执行原理

534 阅读2分钟

npm install 原理:

  1.首先得有package.json 包管理文件 才可以执行npm install

  2.npm install -> 看是否有package-lock.json文件,

  3.没有package-lock.json文件,则构建依赖关系,然后从registry仓库(registry.npmjs.org) 下载安装包(压缩文件),将压缩包添加到本地的缓存文件中再将下载的压缩包解压到node_modules中,同时生成package-lock.json文件,完成安装

   4.有package-lock.json文件,则先检查下载的包和package-lock.json文件中的包版本是否符合semver 版本规范,不一定非要完全一样,像 2.2.1 和 2.2.2 是一样的

   5.不一致,则重新构建依赖关系,然后就是和第三部一样,去仓库下载,加压,添加缓存,解压到 node_modules中,生成新的package-lock.json

   6.一致,则会去本地缓存文件中去查找缓存文件(通过查找算法),找到缓存文件,将压缩包解压到 node_modules中,完成安装

image.png(摘自coderwhy老师的图片)

 补充知识:

1.早期的npm存在很多的缺陷,比如安装依赖速度很慢、版本依赖混乱等等一系列的问题;而yarn 是为了弥补 npm 的一些缺陷而出现的;

2.从npm5开始npm才支持缓存压力 -> 来自了yarn的压力(yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具)

3.安装依赖速度很慢就是没有缓存 之前从registry仓库下载的包 缓存到本地,以便下次下载时可以直接从本地下载而无需再从 registry仓库下载

4.版本依赖混乱则是npm早期包依赖是树结构,这样会导致一个包被多个分支依赖,从而造成包下载多次,下载npm是扁平化结构,每一个包都是同级的

5.node的包版本是符号semver版本规范的:npm semver(docs.npmjs.com/misc/semver…

X主版本号(major):当你做了不兼容的 API 修改(可能不兼容之前的版本);

Y次版本号(minor):当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本);

Z修订号(patch):当你做了向下兼容的问题修正(没有新功能,修复了之前版本的bug)

6.^和~的区别:

^x.y.z:表示x是保持不变的,y和z永远安装最新的版本;

~x.y.z:表示x和y保持不变的,z永远安装最新的版本;