项目安装的时候,会有配置参数,-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 之后的依赖图是这样的:
你看,是不是这个packageA装了3遍,有点多余,后面两次安装其实是多余的。
而 peerDependency 就可以避免类似的核心依赖库被重复下载的问题。
如果在依赖 plugin1 和 plugin2 的 package.json 中使用 peerDependency 来声明核心依赖库
{ "peerDependencies": { "packageA": "1.0.1" } }
那么依赖图就是这样的,可以看到这时候生成的依赖图是扁平的,packageA 也只会被安装一次
- 要求项目拥有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 时会被安装,但是安装失败时不会中断安装行为,程序依旧可以正常运行。
六 依赖混乱
- 把应该在dependencies的包放在了devDependencies
- 下载项目源码的时候,不管哪个字段的包都会被下载安装上。
- 作npm包的时候,这种情况只会下载 dependencies 的依赖,其余依赖将会无视处理,这样别人下载你的 npm 包运行时,就会找不到 xxx 而出错
- 把应该在devDependencies的包放在了dependencies
- 下载项目源码,不管哪个字段的包都会被下载安装上。
- 会同时下载dependencies的包,从而增加本地项目的体积