dependencies、devDependencies区别
他们之间的区别我看了很多篇文章,却也真是没看懂,于是自己写了一个npm包,才发现其中原理。
首先:
说起他们之间的区别,要区分项目和npm包两种方向。
项目
我们在执行npm install的时候,会同时安装devDependencies和dependencies中的依赖到node_modules。
这个时候,把依赖放在devDependencies或者dependencies中,本质上没啥区别。
npm包
如果我们的项目会被当作npm包的方式引入别人的项目,这个时候,就需要注意了。
我们需要把只有在本地开发才会用到的包(webpack、eslint、babel等)
放在devDependencies
中,把程序运行时会用到的包(antd react等)
放在dependencies
中。
为什么?
因为在项目中安装npm包的时候,会安装dependencies中的所有依赖,而不会安装devDependencies中的依赖。
目的当然是为了能让打包后的程序正常运行、又不占用项目体积喽。
注意:
npm包安装时,npm7.x以上的情况下:
如果npm包所需包版本和主应用包版本不冲突的情况下,会使用主应用的包,而不是自己在node_modules中再安装一次。
如若冲突,则会在npm包自己内部的node_modules中再安装一次。
现总结如下:
npm包:安装npm包的时候。只会安装dependencies中的依赖,不会安装devDependencies中的依赖。
项目:npm install项目的时候,会同时安装devDependencies和dependencies中的依赖。
peerDependencies
我们上面说了dependencies、devDependencies的区别,那peerDependencies又是什么呢?
我们一般只在npm包中使用peerDependencies这个关键词。
这里我们只探讨peerDependencies和dependencies的区别:
有人说,peerDependencies默认不会安装,找不到包会警告提示。dependencies会默认安装。
但是npm7.x以后,peerDependencies也会在找不到包的情况下默认安装了!!!
所以,总结了以下两点不同:
1.peerDependencies和dependencies使用场景不同。
peerDependencies用在描述与同伴的依赖性,即保证npm包和宿主程序都使用同一种包的情况下,保证不会产生冲突。
所以我们经常看到这种写法,可以最大限度的保证插件和宿主共用一套环境了
{
"peerDependencies":
{
"react": ">=16.12.0",
"react-dom": ">=16.12.0"
}
}
dependencies用来描述除环境之外的生产环境需要用到的其他包。
2.peerDependencies中的包可以与external结合,以此来保证最终打包到dist的文件不包含peerDependencies中的包含的包。
来减少打包体积。