你真的了解peerDependencies吗

429 阅读2分钟

话不多说,看图。

1. 宿主项目dependencies和npm依赖包的peerDependencies无重名依赖。

A. 使用npm install(npm8)

npm i @blacklake/phoenix-base-icon

结果很显然:npm依赖包的peerDependencies会全部被安装到宿主项目的node_modules中。

B. 使用yarn

yarn add @blacklake/phoenix-base-icon

结果:npm依赖包的peerDependencies全部不会被安装,此时peer的作用更倾向于文档说明,即“你要安装我,必须先安装我的peer”。

2. 宿主项目dependencies和npm依赖包的peerDependencies有重名依赖,但版本不同。

宿主项目安装了一个react依赖,版本为:^18.2.0

A. 使用yarn

yarn add @blacklake/phoenix-base-icon

结果:同样地,npm依赖包的peerDependencies全部不会被安装,但是yarn的过程中,会warning提示,当前宿主项目的react版本和peer中react版本不一致,不过也就仅仅是一个很弱的提示。

B. 使用npm install(npm8)

npm i @blacklake/phoenix-base-icon

结果:注意,直接安装失败!并且是全部失败。 但是输出log中提示你可以试试 --force --legacy-peer-deps,那么我们试试。

C. 使用npm install --force

npm i @blacklake/phoenix-base-icon --force

结果:忽视了版本差距,npm包的peerDependencies中的依赖全部安装成功,和宿主项目依赖重复的,按照宿主项目的版本安装。

D. 使用npm install --legacy-peer-deps

npm i @blacklake/phoenix-base-icon --legacy-peer-deps

结果:无视npm依赖包的peerDependencies,效果等同于yarn。

3. 推荐用法

参考react-navigation,react-native-async-storage/async-storage,react-native-clipboard,react-native-screens等成熟的第三方库:需要宿主项目安装的依赖,同时放到 devDependencies(解决开发时的报错)和peerDependencies中,同时撰写readme,详细列举安装本依赖需要前置安装的npm包。

作者:@贾明磊