dependencies和devDependencies
dependencies和devDependencies在开发中很常用,dependencies依赖的包会被在部署环境中安装
,比如vue、react这些。devDependencies是开发过程中的依赖,如eslint。那么什么是peerDependencies呢?
例子
首先举个例子。打开ant design组件库(antd)的github项目地址,你会发现它的package.json中不仅有dependencies、devDependencies,还有peerDependencies。
1 | "peerDependencies": { |
它的作用是,如果你的工程dependencies有react(>=16.9.0),那么antd库就不会再安装react了,而是直接使用工程里的react(react-dom同理)。
简单来说就是,这样声明依赖后,node_modules目录结构变成了:
1 | ├── your-project |
试想,如果antd的依赖使用dependencies声明
1 | "dependencies": { |
那么它的node_modules目录结构就会变成:
1 | ├── your-project |
也就是说工程里会用到两个版本的react,这很可能会导致一些问题。一般对于基础库,一个工程里只会安装一个且它的版本也是固定的,需要升级的时候再统一处理兼容性问题进行升级。
所以对于antd这种依赖于react的组件库来说,peerDependencies就很适用了,如果主工程的会安装合适的react版本,组件库共用这个版本的react就可以了,而不需要再安装一个,也不会出现不同版本的兼容性问题。
常在插件中使用
peerDependencies在进行插件开发时经常会用到
插件一般有如下特点:
- 插件正确运行的前提是,核心依赖库必须先下载安装,不能脱离核心依赖库而被单独依赖并引用
- 在项目实践中,同一插件体系下,核心依赖库版本最好是相同的
而使用peerDependencies就可以满足这些要求:
- 如果用户依赖了满足peerDependencies声明的核心库,则会忽略peerDependencies的声明
- 如果用户没有依赖核心库,则会按照peerDependencies的声明将库安装到项目的根目录中
- 如果用户依赖的版本和插件依赖的版本之间不兼容,会报错让用户自行修复