peerDependencies完全解读

dependencies和devDependencies

dependencies和devDependencies在开发中很常用,dependencies依赖的包会被在部署环境中安装,比如vue、react这些。devDependencies是开发过程中的依赖,如eslint。那么什么是peerDependencies呢?

例子

首先举个例子。打开ant design组件库(antd)的github项目地址,你会发现它的package.json中不仅有dependencies、devDependencies,还有peerDependencies。

1
2
3
4
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
},

它的作用是,如果你的工程dependencies有react(>=16.9.0),那么antd库就不会再安装react了,而是直接使用工程里的react(react-dom同理)。

简单来说就是,这样声明依赖后,node_modules目录结构变成了:

1
2
3
4
5
├── your-project
│ └── node_modules
│ ├── react
│ ├── antd
│ │ └── nodule_modules

试想,如果antd的依赖使用dependencies声明

1
2
3
4
"dependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}

那么它的node_modules目录结构就会变成:

1
2
3
4
5
6
├── your-project
│ └── node_modules
│ ├── react@x.x.x
│ ├── antd
│ │ └── nodule_modules
│ │ └── react@16.9.0

也就是说工程里会用到两个版本的react,这很可能会导致一些问题。一般对于基础库,一个工程里只会安装一个且它的版本也是固定的,需要升级的时候再统一处理兼容性问题进行升级。

所以对于antd这种依赖于react的组件库来说,peerDependencies就很适用了,如果主工程的会安装合适的react版本,组件库共用这个版本的react就可以了,而不需要再安装一个,也不会出现不同版本的兼容性问题。

常在插件中使用

peerDependencies在进行插件开发时经常会用到

插件一般有如下特点:

  • 插件正确运行的前提是,核心依赖库必须先下载安装,不能脱离核心依赖库而被单独依赖并引用
  • 在项目实践中,同一插件体系下,核心依赖库版本最好是相同的

而使用peerDependencies就可以满足这些要求:

  • 如果用户依赖了满足peerDependencies声明的核心库,则会忽略peerDependencies的声明
  • 如果用户没有依赖核心库,则会按照peerDependencies的声明将库安装到项目的根目录中
  • 如果用户依赖的版本和插件依赖的版本之间不兼容,会报错让用户自行修复
0%