peerDependencies vs dependencies

背景

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

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

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

如何选择

那么问题来了,到底什么情况下该用 dependencies,什么情况下该用 peerDependencies 呢?

接下来看一个例子,项目结构如下:

- A
  - B
    - D
  - C
    - D

项目A中,有B、C两个依赖,他们都依赖了D。

dependencies

我们先考虑一下都用 dependencies 会有什么问题。

如果两个D的版本兼容,如都是 1.0.0,则会得到如下结构:

- A
  - B
  - C
  - D@1.0.0

如果两个D的版本不兼容,可能会得到如下结构:

- A
  - B
  - C
    - D@2.0.0
  - D@1.0.0

于是,打包的时候就得到了两个不同版本的D,但是B和C依然是能正常运行的。如果我们不关心D,只期望B和C始终可以正常工作,那这种方案无疑是很好的。

但是如果我们期望全局只能有一份D,比如D有一份全局共享的配置,或者A也需要访问B和C引用的D,这种方式就会出现前文所遇到的问题。

peerDependencies

那么如果都用 peerDependencies 会有什么问题呢?

首先,所有依赖D的版本都必须兼容,否则会有warning,而且可能无法工作。安装后得到的结构一定是这样的:

- A
  - B
  - C
  - D@兼容版本

这样,全局有且只能有一个D,如果真的出现了B和C依赖的D版本不兼容的情况,就只能升级B和C了。

总结

  • peerDependencies 用于全局共享一个版本依赖的场景,不支持多版本兼容。
  • dependencies 用于非全局依赖的场景,可以支持不同版本同时存在,可用性更高。

所以关键是看,这个依赖是否全局唯一、是否需要被全局引用。如以下几个库作为依赖时,通常都需要以 peerDependencies 存在:

  • codemirror
  • react
  • vue

© 2020