1,安装机制
console.log("npm模块安装机制")
1,发出npm install命令
2,查询node_modules
2_1:存在,跳过
2_2:不存在,向注册中心查询模块地址,下载后存放在更目录.npm,解压到node_modules
2,实现原理
一般会经历6个大的阶段:
1,预安装。2,确定首层依赖模块。3,获取模块。4,模块扁平化。5,安装模块。6,执行工程生命周期
1,工程中若定义了preinstall钩子,则执行
2,首层依赖:dependencies、devDependencies。npm开启多进程在每个首层模块逐步找更深节点
3,递归获取模块:
3-1,获取模块信息如package.json^1.1.0语义化版本范围的分析(具体见底部补充👇),npm会取1.x.x形式的最新版本信息url等。
3-2,上一步会拿到resolved字段也就是模块的地址,npm检查缓存决定是否需要下载
3-3,查找该模块是否还有依赖,有则递归到第一步。没有则停止
4,扁平化。npm3加入了去重过程。
4-1,如果foo和bar依赖lodash@^1.0.0和^1.1.0,则只保留兼容版本1.1.0。
4-2,如果foo和bar依赖lodash@^1.1.0和^2.0.0,则1.1.0下载到node_modules中,2.0.0继续留在依赖树中。
5,按照声明周期(preinstall、install、postinstall),安装模块,更新node_modules
6,如果工程定义了钩子,则被执行。(顺序install、postinstall、prepublish、prepare)。最后更新版本描述文件。
补充小点:语义化版SemVer。举例领会[major, minor, patch]
console.log("语义化版SemVer")
波浪线(~)范围
~1.2.3 <=> [1.2.3, 1.3.0)
~1.2 <=> [1.2.0, 1.3.0)
~1 <=> [1.0.0, 2.0.0)
~0.2.3 <=> [0.2.3, 0.3.0)
~0.2 <=> [0.2.0, 0.3.0)
~0 <=> [0.0.0, 1.0.0)
// 补注号(^)范围 最左不为0+1,右变0
^1.2.3 <=> [1.2.3, 2.0.0)
^0.2.3 <=> [0.2.3, 0.3.0)
^0.0.3 <=> [0.0.3, 0.0.4)
^1.2.3-beta.2 <=> [1.2.3-bta.2, 2.0.0)
^0.0.x <=> [0.0.0, 0.1.0)
^0.0 <=> [0.0.0, 0.1.0)
^1.x <=> [1.0.0, 2.0.0)
^0.x <=> [0.0.0, 1.0.0)
补充小点:操作前 操作后 钩子。举例
package.json
// build前,将依赖包拷贝至当前项目下,build后,将生成的静态文件拷贝至apache服务下。
"scripts": {
...
"prebuild": "cp -rf /home/node_modules/* node_modules",
"postbuild": "cp -rf dist/* /httpd/static/"
}
网友评论