Skip to content

npm install 流程

npm 安装机制

image-20230519133911291

这里面涉及到 npm 不同版本的包的问题,在 npm v3 之后其第一次遇到的包会扁平化到 node_modules 下面,然后当再次遇到不同版本(匹配不符合)的时候就不会再次扁平化到 node_modules 下,而是直接下载到此包下的 node_modules 里面。如下图所示

lodash
  package1@1.1.0
axios
  package1@2.1.0

=>

lodash
package1@1.1.0
axios
  package1@2.1.0

对于上述的结构也就引发了以下几个问题

1. 依赖地狱(Dependency Hell)

对于上述例子发现对于 package 包不同版本的安装了两次,在真实场景下,依赖增多,冗余的包也变多,node_modules 最终会堪比黑洞,很快就能把磁盘占满。而且依赖嵌套的深度也会十分可怕,这个就是依赖地狱。

2. 扁平化的 node_modules

扁平化算法本身复杂性很高,耗时较长

幽灵依赖 Phantom dependencies

这是扁平化 node_modules 引发的问题,即我们明明没有引入 package 包,但是在项目中我们却可以直接使用这个包。这个即带来了方便,但是也带来了很大的问题,就是如果这个版本的包更新了 package 包,那么就会导致项目某明奇妙的出现问题

3. 扁平化结果的不确定性

因为扁平化的结果是根据包中 package.json 的包的前后顺序从而确定哪一个包先下载而提升到根目录,那么如果依赖包的 package.json 修改了,那么就会导致 node_module 不相同

常用配置

  1. npm install --only=[prod[uction]| dev[elopment]]

参数都将导致仅安装 devDependencies 或仅安装非 devDependencies。“

参考

  1. npm install 原理分析