npm install 做了什么

413 阅读2分钟

1 . npm install 同个包名被多个依赖包依赖,会怎么处理??

先说结论 : 1. 层级优先 2.命名顺序优先

首先证明一下命名优先

// 首先准备三个包
包名分别对应 A  B  C
这三个包都依赖react 
假设 
A 依赖react@0.14.0
B 依赖react@15.7.0
C 依赖react@16.8.0
​
假设 package.json中是这样的
{
  "dependencies": {
    "A": "^1.0.0",
    "B": "^1.0.0",
    "C": "^1.0.0",
  }
}
    或者 
    
    {
  "dependencies": {
    "C": "^1.0.0",
    "B": "^1.0.0",
    "A": "^1.0.0",
  }
}
执行  npm install之后,会发现 node_modules,找到react的版本回事0.14.0.
这是怎么回事呢 ? 因为npm install时候,会对package.json中的依赖包的包名进行排序,当然它不会修改我们的package.json文件,所以会导致上面无论哪种情况都是node_modules中的react都是0.14.0
(补充 : 不相信有内部排序,你可尝试这样做, 你先你npm install B  再install A,看看 package.json中后下载的A会排在B前面)
​
结论  : 证明了 顺序优先

补充一点 : 因为以来的版本不同,所以没有直接在node_modules下的react包会被下到对应包的下面的node_modules中

Snipaste_2021-12-16_14-27-49.png 补充 : 如果node_modules中存在react包了,则不会重复下载,删了lock也没用,版本不匹配的则同样需要在包下的node_modules中会安装react

证明一下包层级优先

// 首先准备四个包
包名分别对应 A  B  C D
这四个包都依赖react 
假设 
A 依赖BB 依赖react@0.14.0
C 依赖react@15.7.0
D 依赖react@16.8.0
​
# B包用来测试 ,  不直接下
假设 package.json中是这样的
{
  "dependencies": {
    "A": "^1.0.0",
    "C": "^1.0.0",
    "D": "^1.0.0",
  }
}
    或者 
    
    {
  "dependencies": {
    "D": "^1.0.0",
    "C": "^1.0.0",
    "A": "^1.0.0",
  }
}
执行  npm install之后,会发现 node_modules,找到react的版本回事15.7.0.
,因为D中的B依赖react是两层,而C直接依赖react
结论: 证明了 层级优先

2 . 包名不一样,但是有相同依赖包只是版本不一样的情况,在打包时会有什么行为

// 首先准备四个包
包名分别对应 A  B  C D
这三个包都依赖P
假设 
A 依赖P1.0.0 (暴露xxx变量)
B 依赖P2.0.0 (暴露xxx xxx2变量)
C 依赖P3.0.0 (暴露xxx xxx2 xxx3变量)
​
install 一次
​
下载完之后,node_modules最外层P的包版本为1.0.0
然后import {xxx} from "A"; 
然后import {xxx2} from "B";
然后import {xxx3} from "C";
都不会报错,只是xxx2和xxx3变量编辑器可能无法跳转,但是是不会报错的,因为在B和C的包内部的指向是P包,而node_modules外层P包是1.0.0版本,所以才会导致无法跳转,但是实际上B和C中正常引用的是对应的2.0.03.0.0版本,所以引用是正确的,不会报错的.
​
# 和正常打包过程一样, 根据各自的包引入需要的内容,,支持tree-shaking的正常tree-shaking

\