package.json中的各种依赖

1,240 阅读4分钟

项目安装的时候,会有配置参数,-D或者-S,而且package.json文件的依赖也是有好几种,具体都是做什么的呢?

一、依赖的位置区分

项目中的package.json文件会有 dependencies ,安装后的node_modules的文件夹内,每个npm包也有自己的package.json文件,以此区分,包在项目中还是依赖中。

二、dependencies

是项目依赖,开发和页面呈现都需要的,也就是说项目依赖即在开发环境中,又在生产环境中,例如js的框架,react/react-router,各种ui框架。

项目中

会在npm install的时候被安装

依赖中

项目依赖A包,A包的package.json内 dependencies 包含B包,那么B包也会被安装。

所以在开发npm包的时候,需要辨别依赖的包放在哪个依赖项里面,防止使用者安装了不必要的包,增加本地代码体积

三、devDependencies

是开发依赖,就是一些在开发时候才会用到的工具包,webpack,eslint等项目上线后不需依赖相关代码运行的工具,包括ts相关的校验工具

项目中

会在npm install的时候被安装

依赖中

项目依赖A包,A包的package.json内devDependencies包含B包,那么B包不会被安装。防止使用者落下了某个npm包造成开发过程中的报错。

四、peerDependencies

只有在发布自己的包时才会用到

这个是什么意思呢?举个栗子:

假设现在有一个 helloWorld 工程,已经在其 package.json 的 dependencies 中声明了 packageA,有两个插件 plugin1 和 plugin2 他们也依赖 packageA,如果在插件中使用 dependencies 而不是 peerDependencies 来声明 packageA,那么 $ npm install 安装完 plugin1 和 plugin2 之后的依赖图是这样的:

image.png

你看,是不是这个packageA装了3遍,有点多余,后面两次安装其实是多余的。

而 peerDependency 就可以避免类似的核心依赖库被重复下载的问题。

如果在依赖 plugin1 和 plugin2 的 package.json 中使用 peerDependency 来声明核心依赖库

{ "peerDependencies": { "packageA": "1.0.1" } }

那么依赖图就是这样的,可以看到这时候生成的依赖图是扁平的,packageA 也只会被安装一次

image.png

  • 要求项目拥有peerDependencies所指定的环境依赖, 完成子环境要求父环境具有某些依赖包
  • 提升项目(插件)依赖
  • 减少重复安装依赖

项目中

不起作用,主要定义在依赖包中,install 时 peerDependencies 不会被安装,开发时一般会配合 devDependencies 来实现开发和发包时的版本解耦。

依赖中

不会被安装,但是包管理器会检查项目的依赖与 peerDependencies 是否匹配,如果不匹配将收到警告

peerDependencies 在npm3及其之后的版本起到的作用只是提示作用

react-bmapgl的package.json

  "name": "react-bmapgl",
  "peerDependencies": {
    "mapvgl": ">=1.0.0-beta.146",
    "react": ">=16.8.0",
    "react-dom": ">=16.8.0"
  },

五、optionalDependencies

optionalDependencies 用于定义可选依赖项,和 dependencies 非常类似。

如果一个依赖关系可以被使用,但是想npm在找不到它或安装失败的情况下,项目仍然能够运行或者希望npm继续运行,就可以使用optionalDependencies

另外optionalDependencies会覆盖dependencies中的同名依赖包,所以不要在两个地方都写

项目中

install 时会被安装,但是安装失败时不会中断安装行为,程序依旧可以正常运行。项目中使用时应该通过判定该包是否存在来决定所需要执行的代码。

依赖中

install 时会被安装,但是安装失败时不会中断安装行为,程序依旧可以正常运行。

六 依赖混乱

  1. 把应该在dependencies的包放在了devDependencies
  • 下载项目源码的时候,不管哪个字段的包都会被下载安装上。
  • 作npm包的时候,这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会找不到 xxx 而出错
  1. 把应该在devDependencies的包放在了dependencies
  • 下载项目源码,不管哪个字段的包都会被下载安装上。
  • 会同时下载dependencies的包,从而增加本地项目的体积

七、参考文献

juejin.cn/post/713722… blog.csdn.net/astonishqft…