npm install 做了什么?
首先,安装的依赖都会放在node_modules文件夹里,默认采用扁平化的方式安装;
ps: 文件存放规则是:.bin -> @xx -> adcd文件开头名
在遍历依赖树的时候,会先处理根目录下的依赖,然后会逐层处理每个依赖包的依赖,直到所有依赖包被处理完毕。
扁平化?
扁平化只是理想状态 :
一级依赖A和一级依赖B都依赖于同一个依赖C运行(包名和版本一致),这时候会将C依赖提到一级目录,可供A和B复用;
不理想的状态:
一级依赖A和一级依赖B都依赖与同一个依赖C运行,但是两个C的包名和版本不一致,无法做到A和B复用;这时只能在依赖包A的node_modules和依赖包B的node_modules里下载安装不同的依赖C。
npm install 后续流程
人话:
- npm install 之后会先通过config list 去找.npmrc的文件路径,首先访问项目级的.npmrc文件,再访问用户级的.npmrc文件,再访问用户级的.npmrc文件,最后访问npm内置的.npmrc文件;
- 检查文件里是否有package-lock.json文件
- 有:将package.json与package-lock.json文件进行对比(检查包名和版本一致性),不一致的话以package.json为准,去更新package-lock.json;一致就去检查缓存有无,有缓存就直接解压到node_models里,没缓存就去npm官网下载包资源,添加到缓存,更新package-lock.josn解压到node_models里。
- 没有:就去获取包信息,同时做扁平化和构建依赖树操作,然后检查缓存有无,有缓存就直接解压到node_models里,没缓存就去npm官网下载包资源,添加到缓存,更新package-lock.josn解压到node_models里。
至于npmrc可以配置什么给大家一个demo参考
registry=http://registry.npmjs.org/
# 定义npm的registry,即npm的包下载源
proxy=http://proxy.example.com:8080/
# 定义npm的代理服务器,用于访问网络
https-proxy=http://proxy.example.com:8080/
# 定义npm的https代理服务器,用于访问网络
strict-ssl=true
# 是否在SSL证书验证错误时退出
cafile=/path/to/cafile.pem
# 定义自定义CA证书文件的路径
user-agent=npm/{npm-version} node/{node-version} {platform}
# 自定义请求头中的
User-Agent save=true
# 安装包时是否自动保存到
package.json的dependencies中 save-dev=true
# 安装包时是否自动保存到package.json的devDependencies中
save-exact=true
# 安装包时是否精确保存版本号
engine-strict=true
# 是否在安装时检查依赖的node和npm版本是否符合要求
scripts-prepend-node-path=true
# 是否在运行脚本时自动将node的路径添加到PATH环境变量中
package-lcok.json 的作用
主要是用来记录版本号和依赖树的详细信息的
-
version 该参数指定了当前包的版本号
-
resolved 该参数指定了当前包的下载地址
-
integrity 用于验证包的完整性
-
dev 该参数指定了当前包是一个开发依赖包
-
bin 该参数指定了当前包中可执行文件的路径和名称
-
engines 该参数指定了当前包所依赖的Node.js版本范围