关于peerDependencies的一些疑问

我对peerDependencies的理解是让插件使用自身项目装的依赖包,就是说是不是插件与我项目都使用了同样的包就可以放到peerDependencies里面去。但是我看ant-design-vue这种也只是写了vue@vue/compiler-sfc

  "peerDependencies": {
    "@vue/compiler-sfc": ">=3.1.0",
    "vue": ">=3.1.0"
  }

所以其他的例如eslint vue-router这些为什么不放在这个字段里面呢?如果自身项目没写eslint安装这个库的时候不是也会装eslint吗?
另外还有一个疑问就是我看网上介绍peerDependencies的项目都是这种文件形式:

MyProject
|- node_modules
   |- PackageA
      |- node_modules
         |- PackageB

现在初始化一个项目没有看到说packageA下面还有node_modules,是因为统一装到自身项目的node_modules下面了吗?那如果是这样的话写peerDependencies还有什么意义呢?

阅读 3k
3 个回答

有意义。比如说 vue 这个库,你如果不是 peerDependencies 那么会造成一个问题:两份 Vue 代码,并且因为不是同一个实例,导致数据并不共享,比如说有 Vue.useVue.filter 之类的就没有公用。

  1. eslint,vue-router 明显放到 devDependencies 里更合适,他们是辅助开发的,执行时不需要。
  2. packageA 这种应该是 dependencies 和项目 dependencies 冲突,所以单独装一套。如果不冲突的话都会装在项目的 node_modules 里。这跟 peerDependencies 没关系。

安装的包的peerDependencies一定程度上约束了你主应用安装同样包的版本,例如ant-design-vuepeerDependenciesvue的版本要求是>=3.1.0,如果此时你主应用vue的版本为2.x,那明显不符合组件库版本要求,要求你升级主应用vue版本3.1.0及以上才行。

同样webpack版本v4v5的类似问题,如果主应用装的less-loader>=8,但webpack又是v4,那么会报错less-loader版本问题,因为在less-loader中要求webpackv5

"peerDependencies": {
  "less": "^3.5.0 || ^4.0.0",
  "webpack": "^5.0.0"
},
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题