2代npm中依赖的问题与解决方法

想象一下,有三个模块:A,B和C。A引用1.0版本的B,而C则是引用了2.0版本的B。

现在我们有一个程序,它同时引用了模块A和模块C。


依赖地狱

对于nodejs,在其他运行环境之前,一个包管理器应该试图提供B模块的某个版本。这个就是依赖地狱了。(提供哪个版本都不行,因为版本不同,特性可能不同,因此可能会造成某些不可预料的事情)

npm的解决方法是都将B模块的两个版本添加到树种,而不是像上面一样,只加载B的某一个版本而已。并且两个版本都嵌套在引用它们的模块之下。

在终端,可能如下:

你也可以列出依赖,并且查看他们的关系使用npm ls:

如果你只是想看最顶层的依赖,你可以使用:

npm ls --depth=0


npm和nodejs的模块加载器

然而,npm做这些还不够。尽管嵌套的路径允许同个模块的不同版本共存,但是大多数的模块加载器并无法加载两个不同版本的模块到内存中。幸运的是,nodejs的模块加载器能够,并且能够很容易地加载不同版本的模块,并且使它们无任何冲突。

npm和Nodejs如何完美地共生着。它们都是由同一个人写的,就像是一张纸的两面。


链接: https://fly63.com/course/21_1003