package.json文件中两种常见的依赖类型
dependencies(生产依赖):项目运行时必需的包devDependencies(开发依赖):项目开发时需要的工具包
一、安装时带-D
npm install xxx -D ,安装包会装到devDependencies,xxx是开发环境需要的安装包,也可以说是编译、打包、测试需要的安装包,发布好后的运行环境不需要。
常见的开发依赖有:vite、webpack、eslint、typeScript...
二、安装时不带-D
npm instal xxx ,安装包会装到dependencies里,运行时需要,上线后必须存在,在项目中会import或require,例如:vue、react、axios...
三、可能派生的问题
1、把开发需要和运行时需要弄混怎么办?
- 把devDependencies的安装包安装到dependencies:生产环境多装了无用代码,会让镜像体积变得臃肿,安装速度变慢
- 把dependencies的安装包安装到devDependencies:部署代码失败,运行不起来
2、npm install --production的作用?
通常我们执行npm install时会把开发依赖和生产依赖都安装下来。而npm install --production模拟最精简的生产环境,或者单纯想省硬盘空间/提速时会用此命令。
另外npm install xxx时除了安装xxx,会检查开发依赖是否都安装好,如果没有,在安装xxx时会顺手安装开发依赖。而npm install xxx --production 不会检查开发依赖是否安装,xxx会安装到dependencies,然后检查生产依赖,存在未安装的生产依赖会直接安装生产依赖。
除了使用--production标志,当环境变量 NODE_ENV 被设置为 production 时,npm install 也会表现出相同的行为
3、减少依赖的好处
减少镜像体积,加速安装,减少攻击面
4、如果A依赖B,B的devDependencies里有C,项目A能用到C吗?
不能,dependencies的依赖可以进行依赖传递,但是devDependencies的依赖不会进行传递。
5、peerDependencies和devDependencies的区别?
- devDependencies:本地开发依赖
- peerDependencies:插件宿主声明,告诉宿主环境我这里需要peerDpendencies里面的安装包,如果需要的安装包版本与宿主的安装的版本不能兼容,安装时会检查到且安装报错。