peerDependencies、devDependencies和dependencies的区别
devDependencies
先看看devDependencies,这个是说我们开发环境依赖,不会打包到生产环境,对线上环境不会产生影响
dependencies
这个是说我们要用到生产环境的依赖,没有这些会影响到项目的稳定运行
peerDependencies
这个一般如果你不是一些库的开发者,基本不用用到,那到底和上面两个有什么区别呢?
举个例子,就是说它的使用必须是依赖宿主环境已经安装好它需要的库,
peerDependencies
的作用主要是用来做版本检查的,例如 react-router
的 peerDependencies
是 react>=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.21
、4.0.5
和 4.0.0
三个版本,如果我们并不想安装三个版本的 lodash,所有的版本统一为 4.17.21
,那么我们可以这样写:
{ "resolutions": { "lodash": "4.17.21" } }