NodeJs (npm install) 原理?

106 阅读3分钟

npm install 做了什么?

首先,安装的依赖都会放在node_modules文件夹里,默认采用扁平化的方式安装; ps: 文件存放规则是:.bin -> @xx -> adcd文件开头名 在遍历依赖树的时候,会先处理根目录下的依赖,然后会逐层处理每个依赖包的依赖,直到所有依赖包被处理完毕。 2018_05_26_10_55_2BE2531A-DB1F-4E1B-9422-72DFB7A04EE7.JPG

扁平化?

扁平化只是理想状态 :

一级依赖A和一级依赖B都依赖于同一个依赖C运行(包名和版本一致),这时候会将C依赖提到一级目录,可供A和B复用;

不理想的状态:

一级依赖A和一级依赖B都依赖与同一个依赖C运行,但是两个C的包名和版本不一致,无法做到A和B复用;这时只能在依赖包A的node_modules和依赖包B的node_modules里下载安装不同的依赖C。

npm install 后续流程

2018_05_26_10_55_2BE2531A-DB1F-4E1B-9422-72DFB7A04EE7.JPG 人话:

  1. npm install 之后会先通过config list 去找.npmrc的文件路径,首先访问项目级的.npmrc文件,再访问用户级的.npmrc文件,再访问用户级的.npmrc文件,最后访问npm内置的.npmrc文件;
  2. 检查文件里是否有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版本范围