peerDependencies、devDependencies和dependencies的区别

devDependencies

先看看devDependencies,这个是说我们开发环境依赖,不会打包到生产环境,对线上环境不会产生影响

dependencies

这个是说我们要用到生产环境的依赖,没有这些会影响到项目的稳定运行

peerDependencies

这个一般如果你不是一些库的开发者,基本不用用到,那到底和上面两个有什么区别呢?

举个例子,就是说它的使用必须是依赖宿主环境已经安装好它需要的库,

peerDependencies 的作用主要是用来做版本检查的,例如 react-routerpeerDependenciesreact>=16.8.0,那么就会出现 3 种情况:

  • 项目下压根没有安装 react,安装。
  • 项目下的 react 符合要求,确实 >=16.8.0,比如 17.0.2, npm、yarn、pnpm 都能安装成功。
  • 项目下的 react 不符合版本要求,比如 16.0.0,npm 安装会直接报错,并且安装不成功、yarn 会报一个不够明显的警告,但安装是成功的、pnpm 会报警告,但安装是成功的。

项目下没有预先安装 peerDependencies 包时,不同的包管理工具表现有所不同

  • Yarn:不会安装 peerDependencies 的依赖
  • npm:会安装 peerDependencies 的依赖,并且提取到 node_modules 下
  • pnpm:会安装 peerDependencies 的依赖,但不会提取到 node_modules 下

NPM 包查找规则

它的查找规则就是:

  • /home/project/demo/node_modules/react-router: 先看看项目下的 node_modules 是否存在
  • /home/project/node_modules/react-router:再看父级目录的 node_modules 是否存在
  • /home/node_modules/react-router:同上
  • /node_modules/react-router:同上

包管理工具的表现

npm(9.5.1)

  • 把所有的依赖都打平到 node_modules 下面
  • 安装了 peerDependencies
  • npm应对多版本,组件库优先查找自身node_modules下版本1.0,找不到在找使用项目中的,项目中的安装的是0.x版本,所以项目使用的是0.x版本

Yarn(1.22.19)

  • 把所有的依赖都打平到 node_modules 下面
  • 没有安装 peerDependencies
  • yarn应对多版本,同上。

pnpm(8.5.0)

  • 自身的依赖并没有打平到 node_modules 下,
    • .pnpm 并不在 Node.JS 模块查找规则上,所以在项目下的文件 require 时仅能用到 react-router 这一个包
    • react-router 是一个软链接,它链接到了 .pnpm/react-router@6.11.2_react@18.2.0/node_modules/react-router
  • pnpm应对多版本,pnpm 对于项目下的,按照查找规则,会找到 node_modules 下 0.x 的版本,0.x 的版本再 link 到 .pnpm 对应正确的目录

对于 npm 包而言,其有以下特点:

  • 对于开发者而言,如果需要对外暴露 dependencies 的内容,应该重新导出 dependencies 的 API
  • 对于使用者而言,在进行 npm install 包名的时候会自动把 dependencies 安装上
  • 对于使用者而言,其不需要关注 dependencies 的包的版本和内容

resolutions

resolutions 是 package.json 中的一个配置,用于强制覆盖版本,例如整个项目里 lodash 有 4.17.214.0.54.0.0 三个版本,如果我们并不想安装三个版本的 lodash,所有的版本统一为 4.17.21,那么我们可以这样写:

{
  "resolutions": {
      "lodash": "4.17.21"
  }
}

  




posted @ 2025-06-30 11:52  ~小晨晨  阅读(160)  评论(0)    收藏  举报