内容来源:
是什么?
npm(node package manager), 是node.js的包管理工具,也是javascript世界的包管理工具。
为什么用它?
npm提供了包管理功能,包括发布和共享代码,管理依赖和版本控制,帮助开发者更方便的开发和分享代码。
npm包规则和结构
首先,安装的依赖包会放在根目录的node_modules中, 默认扁平化的方式安装,依赖中有共用的同版本依赖,会被提到根目录去复用(扁平化问题:同一个包,但版本不同,则不会复用,则会尝试在当前依赖下面另外安装适合版本)。 广度优先的算法,首先处理根目录依赖,再逐层深入处理子依赖的依赖,直到所有依赖处理完毕。(若遇到相同依赖,会去检查与项目中其他依赖是否相同,若相同则复用,不同则会尝试安装适合版本)。
扁平化(理想状态下可复用)
非理想状态下
项目中,有两个相同依赖C,但依赖的版本号不一样,那么B会在它的目录下再次下载C@2.0版本,还是会有模块冗余现象。
npm install的安装过程?
-
npm install >
-
检查config[npm config list]:检查获取.npmrc :
- 找当前项目级.npmrc > 用户级.npmrc > 全局.npmrc > npm内置的.npmrc .npmrc的配置?
-
检查package-lock.json
-
有lock.json > 比较package.json和package-lock.json 是否一致
- 一致 > 获取包信息 > 构建依赖树+扁平化 > 检查缓存
- 有缓存 > 解压到node_modulesbianapinghua
- 没有缓存 > 下载资源 > 检查完整性 > 生成缓存 > 更新lock.json > 解压到node_modules
- 不一致 > 以package.json为主,下载解压完成后更新lock.json,版本号相同,则会根据lock.json的版本号去下载
- 一致 > 获取包信息 > 构建依赖树+扁平化 > 检查缓存
-
没有lock.json > 获取包信息 > 构建依赖树+扁平化 > 检查缓存 > 同上
package-lock.json
作用:
- 帮我们锁定版本号
- 帮我们做了缓存:lock.json 利用name + version + integrity作为唯一的key,这个key对应npm cache下的index-v5下的缓存记录,只要对上key,则会用它解压出依赖包,放到项目的node_modules中
参数:
- version: 当前包版本号
- resolved: 包资源下载地址
- integrity: 用于验证包完整性
- dev: 是否是一个开发依赖包
- bin:指定该包的可执行文件名称和地址
- engines: 指定包依赖的node版本范围