Appearance
npm install 流程
npm 安装机制
这里面涉及到 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 不相同
常用配置
npm install --only=[prod[uction]| dev[elopment]]
参数都将导致仅安装 devDependencies 或仅安装非 devDependencies。“