npm2下的模块安装机制
npm2安装多级的依赖模块采用嵌套的安装方式:
优点和弊端
优点:解决了版本单一时存在的存在的不兼容问题,实现多版本兼容
弊端:可能造成相同模块大量冗余的问题,如下:
npm3下的模块安装机制:
1.在安装某个二级模块时,若发现第一层级还没有相同名称的模块,便把这第二层级的模块放在第一层级
2.在安装某个二级模块时,若发现第一层级有相同名称,相同版本的模块,便直接复用那个模块
3.在安装某个二级模块时,若发现第一层级有相同名称,但版本不同的模块,便只能嵌套在自身的父模块下方
npm3是否已经把npm2的模块冗余的缺陷优化到极致了呢? ———答案是没有,请往下看:
实际上:npm3中仍然可能出现模块冗余的情况,因为一级目录下已经有v1.0的C模块了,所以所有的v2.0只能作为二级依赖模块被安装,这样你就会看到如下的情况:
那么这有没有什么解决的方式呢?当然是有的,当A模块下的C v1.0模块被更新至C v2.0的前提下,我们可以通过npm dedupe把所有C v2.0的二级依赖模块“重定向”到一级目录下的那个C v1.0。
虽然 npm v3 解决了目录长度的嵌套过深,相同的依赖存储多份这两个问题,但是此时的 npm 仍然存在诸多问题,被人诟病最多的应该就是它的不确定性了。
npm v5
什么是确定性。在 JavaScript 包管理的背景下,确定性是指在给定的 package.json 和 lock 文件下始终能得到一致的 node_modules 目录结构。简单点说就是无论在何种环境下执行 npm install 都能得到相同的 node_modules 目录结构。npm v5 正是为解决这个问题而产生的,npm v5 生成的 node_modules 目录和 v3 是一致的,区别是 v5 会默认生成一个 package-lock.json 文件,来保证安装的依赖的确定性。
package-lock.json 文件里记录了安装的每一个依赖的确定版本,这样在下次安装时就能通过这个文件来安装一样的依赖了。