package.json中peer依赖需同时声明在peerDependencies和dependencies中吗?
类库开发中peer依赖的正确声明方案
针对React、axios这类需要宿主环境提供的公共依赖,按照npm官方约定和社区成熟最佳实践处理即可,核心规则如下:
- 不要将这类依赖同时写入
peerDependencies和dependencies字段
npm不会自动忽略重复声明的peer依赖,如果两个字段同时存在同个依赖条目,只要宿主安装的版本不满足你在dependencies中声明的版本范围,npm就会在你的包目录下单独安装一份对应版本的依赖,直接造成打包体积冗余,甚至触发React多实例这类难以排查的运行时错误,完全违背设置peer依赖的初衷。 - 本地开发/测试依赖缺失的最优解:将这类依赖同时写入
peerDependencies和devDependencies
两个字段的职责完全独立,不会产生任何冲突:peerDependencies:面向使用你包的宿主应用,明确声明宿主需要自行安装的依赖和兼容版本范围,npm安装时会做版本校验,不会强制把依赖塞给宿主,完全把依赖控制权交给业务方,从根源避免重复打包问题。devDependencies:仅面向你本地的开发、测试、构建流程,npm拉取仓库安装开发依赖时会自动安装这部分包,跑单测、本地调试、构建demo都不会出现依赖缺失问题,这部分依赖永远不会被下游宿主感知,不会增加最终产物的体积。
版本配置提示:
peerDependencies的版本范围尽量设置宽松,比如React可以配置为"react": ">=16.8.0",避免不必要的版本限制阻碍宿主升级;devDependencies里的版本可以指定你本地测试覆盖过的具体版本,只要和peer声明的兼容范围匹配即可,不需要完全对齐。
- 关于npm 7+的默认行为补充:npm 7之后的版本默认会自动安装符合版本范围的peer依赖,但如果你的包把这类依赖写进了
dependencies,依然会触发多版本安装的问题,不存在自动去重的兜底逻辑,不要依赖这种错误写法。
内容的提问来源于stack exchange,提问作者Tim Hysniu
相关产品推荐
相关产品推荐

