想必前端同窗对npm的devDependencies和dependencies都比较熟悉,可是对peerDependencies可能就有点陌生,尤为是没有写过npm包插件的同窗,好比以前使用grunt自动化工具的相关插件(如grunt-contrib-jasmine等)或者目前基于某个框架的ui组件库等等,这些都是须要对peerDependencies有必定了解的。下面咱们就来讲说peerDependencies。javascript
假设咱们当前的项目是MyProject,项目中有一些依赖,比方其中有一个依赖包PackageA,该包的package.json文件指定了对PackageB的依赖:html
{ "dependencies": { "PackageB": "1.0.0" } }
若是咱们在咱们的MyProject项目中执行npm install PackageA
, 咱们会发现咱们项目的目录结构会是以下形式:前端
MyProject |- node_modules |- PackageA |- node_modules |- PackageB
那么在咱们的项目中,咱们能经过下面语句引入"PackageA":java
var packageA = require('PackageA')
可是,若是你想在项目中直接引用PackageB:node
var packageA = require('PackageA') var packageB = require('PackageB')
这是不行的,即便PackageB被安装过;由于Node只会在“MyProject/node_modules”目录下查找PackageB,它不会在进入PackageA模块下的node_modules下查找。react
因此,为了解决这个问题,在MyProject项目package.json中咱们必须直接声明对PackageB的依赖并安装。git
可是,有时咱们不用在当前项目中声明对PackageB的依赖就能够直接引用,尤为是,PackageA是一个相似于grunt的插件,例如grunt-contrib-jshint。github
为何在项目中不用声明就能够直接使用呢?这就不得不说说peerDependencies的做用了。npm
为了解决这种问题:json
若是你安装我,那么你最好也安装X,Y和Z.
因而peerDependencies
就被引入了。例如上面PackageA的package.json文件若是是下面这样:
{ "peerDependencies": { "PackageB": "1.0.0" } }
那么,它会告诉npm:若是某个package把我列为依赖的话,那么那个package也必需应该有对PackageB的依赖。
也就是说,若是你npm install PackageA
,你将会获得下面的以下的目录结构:
MyProject |- node_modules |- PackageA |- PackageB
你可能注意到:
在npm2中,即便当前项目MyProject中没有直接依赖PackageB,该PackageB包依然会安装到当前项目的node_modules文件夹中。
下面的代码如今能够正常工做了,由于两个包在"MyProject/node_modules"中被安装了:
var packageA = require('PackageA') var packageB = require('PackageB')
总结一句话,peerDependencies
的具体做用:
peerDependencies
的目的是提示宿主环境去安装知足插件peerDependencies所指定依赖的包,而后在插件import或者require所依赖的包的时候,永远都是引用宿主环境统一安装的npm包,最终解决插件与所依赖包不一致的问题。
举个例子,就拿目前基于react的ui组件库ant-design@3.x来讲,因该ui组件库只是提供一套react组件库,它要求宿主环境须要安装指定的react版本。具体能够看它package.json中的配置:
"peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" }
它要求宿主环境安装react@>=16.0.0和react-dom@>=16.0.0的版本,而在每一个antd组件的定义文件顶部:
import * as React from 'react'; import * as ReactDOM from 'react-dom';
组件中引入的react和react-dom包其实都是宿主环境提供的依赖包。
正如上一节谈论的,在npm2中,PackageA包中peerDependencies
所指定的依赖会随着npm install PackageA
一块儿被强制安装,因此不须要在宿主环境的package.json文件中指定对PackageA中peerDependencies
内容的依赖。
可是在npm3中,peerDependencies
的表现与npm2不一样:
npm3中不会再要求peerDependencies所指定的依赖包被强制安装,相反npm3会在安装结束后检查本次安装是否正确,若是不正确会给用户打印警告提示。
就拿上面的例子来讲,若是咱们npm install PackageA安装PackageA时,你会获得一个警告提示说:
PackageB是一个须要的依赖,可是没有被安装。
这时,你须要手动的在MyProject项目的package.json文件指定PackageB的依赖。
另外,在npm3的项目中,可能存在一个问题就是你所依赖的一个package包更新了它peerDependencies的版本,那么你可能也须要在项目的package.json文件中手动更新到正确的版本。不然会出现相似下图所示的警告信息:
一、Peer Dependencies
二、package.json文件
三、Dealing with the deprecation of peerDependencies in NPM 3