20,npm install机制。why

2019-11-19  本文已影响0人  r8HZGEmq

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/"
  }
上一篇下一篇

猜你喜欢

热点阅读