peerDependencies vs dependencies

2017-07-09  本文已影响850人  寂寞的原子

这几天遇到个大坑,就是在代码完全正确的情况下,配置始终不能生效。调试了好久都找不到原因,直到我抱着一丝希望去查看源码,意外发现了问题所在:

一个包被打包了两次,配置和最终运行的是不同的版本。

如果你还不了解npm的原理,可以去这里

接下来先简单介绍一下出问题的项目结构:

- A
  - B
    - C
  - C

大概就是这样:项目A中,有B和C两个依赖,其中B是一个库,B在dependencies中也依赖了C。

最初用npm安装的时候,B依赖的C和A依赖的C是同一个版本,所以得到了如下结构:

- A
  - B@1.0.0 (此处直接依赖上一层的C@1.1.0)
  - C@1.1.0

后来又一次在项目A中升级了版本,得到了如下结构:

- A
  - B@1.0.0
    - C@1.1.0
  - C@1.2.0

由于B依赖的C和A依赖的C版本不同,所以根据npm的规则,B内部也安装了一个C。

于是,打包的时候由于两个版本被认为是互不兼容的,所以会分别被打包进去。在B中调用C进行配置的时候运行的是C@^1.1.0,而A中调用C最终使用的时候运行的是C@^1.2.0,所以出现了上面所说的结果,配置始终不能生效。

发现了问题就好办了,解决方法:dependencies改成peerDependencies,这样就不会在B内部再安装一个C,而只是在版本不兼容时出现warning。

问题至此解决,总结一下:作为一个库,就不应该随便用dependencies,而应该用peerDependencies

上一篇 下一篇

猜你喜欢

热点阅读