npm库中使用的rxjs应设为dependency、peerDependency还是二者都要?
解决方案
你当前场景的正确依赖配置方式是将rxjs同时列在peerDependencies和devDependencies中,不需要加入dependencies,原因如下:
- 为什么要配置
peerDependencies
peerDependencies的设计定位就是适配公共库的使用场景:要求使用该库的宿主环境必须安装符合指定版本范围的对应依赖,npm不会在你的库的node_modules目录下单独安装私有版本的rxjs,能够保证整个项目中只存在一份rxjs实例,既满足你要求宿主使用适配版本rxjs的需求,也能避免多份rxjs实例导致的类型不兼容、实例判断失效(例如库返回的Observable在宿主项目中instanceof Observable返回false)等问题。 - 为什么要配置
devDependencies
npm 3及以上版本不会自动安装peerDependencies下的依赖,因此你本地开发、构建库的环境中如果没有安装rxjs,就会抛出找不到模块的TS报错。将rxjs加入devDependencies后,只会在你本地开发、构建库的环节安装对应依赖,发布到npm仓库后不会被使用库的用户下载安装,不会影响宿主的依赖树结构。 - 为什么不能只配置
dependencies
如果仅将rxjs加入dependencies,当宿主项目安装的rxjs版本和你声明的版本范围不匹配时,npm会在你的库的node_modules目录下单独安装一份私有rxjs,完全违背你想要统一rxjs版本的需求。
版本声明建议
你可以在peerDependencies中声明宽松的兼容版本范围,例如你开发时使用rxjs v6,可写为"rxjs": "^6.0.0",如果允许宿主使用v7版本可调整为"rxjs": ">=6.0.0 <8.0.0";devDependencies中可以固定你开发、构建时使用的具体rxjs版本即可。
内容的提问来源于stack exchange,提问作者peterc
相关产品推荐
相关产品推荐

