dependencies和devDependencies作用
在 Node.js 项目(包括前端项目)中,dependencies 和 devDependencies 是 package.json 文件中用于定义项目依赖的两个主要字段。它们的核心区别在于依赖的用途和安装环境。
dependencies和devDependencies理解
1.dependencies(生产依赖)
作用:项目运行所必需的包,即生产环境中需要用到的依赖。
安装方式:
npm install <package_name> --save # 或简写为 npm install <package_name>
yarn add <package_name>
2.devDependencies(开发依赖)
作用:仅在开发阶段需要的包,用于辅助开发、构建、测试等,不会被打包进生产环境代码。
安装方式:
npm install <package_name> --save-dev # 或简写为 npm install <package_name> -D
yarn add <package_name> --dev
dependencies和devDependencies误区(非常重要)
1.问题:如果我将打包工具Vite、Babel、eslint等这种构建工具依赖放在dependencies中,在项目执行build的时候会不会被打包进dist产物中?
答案是:build构建与devDependencies和dependencies无关,只要是项目中用到的依赖,不管这个依赖是放在devDependencies还是dependencies,都会被打包进dist产物中。
2.npm包的devDependencies
在开发npm包提供给其他项目使用,其他项目安装这个npm库时,npm配置在dependencies的依赖会被安装在组件库的node_modules中,如果该项目本身就有dependencies的相同的库依赖,可能会产生冲突。
例子:基于vue3+element-plus二次开发一个nb-ui组件,nb-ui组件将element-plus^2.2.36依赖配置在dependencies上;当其他项目安装nb-ui组件时,element-plus^2.2.36会被安装在组件库的node_modules中, 如果本身项目中也安装了element-plus,版本是不同于2.2.36,就会导致引入两个版本的element-plus。如果是一些其他的库,项目版本和npm包内部使用,安装两个版本的库,构建两个实例的话容易出现一些奇怪的bug。
关于peerDependencies
peerDependencies 也是 package.json 中的一个属性,它默认库的使用者项目内已经安装过相关依赖,但是它不会自动检测并帮你安装。打包项目时,其中的包也不会被打包进去。
在开发插件时,你的插件需要某些依赖的支持,但是你又没必要去安装,因为插件的宿主会去安装这些依赖。此时就可以用 peerDependencies 去声明一下需要依赖的插件和版本。如果出问题的话,npm 会有警告来提示使用者去解决版本中的冲突。
在 npm2 中,packageName 包中 peerDependencies 的依赖会随着 npm install packageName 一起被强制安装。所以不需要库的使用者额外安装 peerDependencies 所需的依赖。
在 npm3+ 中,则不会强制安装 peerDependencies 中的依赖。但是使用者没有提前安装 peerDependencies 中所需依赖的话, npm3 会在安装结束后打印警告信息:xxx 是一个需要的依赖,但是没有被安装。此时,使用者需要手动的在项目中安装 xxx 依赖。
总结
devDependencies和dependencies的区别核心体现在npm包中,如果开发的项目是发npm包提供给外部、其他项目使用,需要注意依赖安装的地方; 如果是自己项目package.json配置使用,依赖安装devDependencies和dependencies实际上没有区别,其主要是便于阅读区分依赖而已。