package.json 中 dependencies、devDependencies 与 peerDependencies 的区别
dependencies 是生产运行必需(npm install 自动装),devDependencies 仅开发期需要(npm install --save-dev,生产可用 --omit=dev 跳过),peerDependencies 声明宿主项目应提供的包(插件类库使用,npm 7+ 自动安装并检查冲突)。
一句话区分:dependencies 是应用跑起来必须的包,devDependencies 只有开发/构建/测试时才需要,peerDependencies 是"我的包依赖宿主项目提供某个包"的声明。 安装命令对应 npm install pkg 与 npm install -D pkg。
dependencies
"dependencies": { "express": "^4.18.0" }
生产环境运行必需。npm install 总会安装;别人把你的包当依赖装时,这些也会被连带安装。放错了会导致生产缺包崩溃,或把测试库带进生产镜像。
devDependencies
"devDependencies": { "jest": "^29.0.0", "eslint": "^8.0.0" }
只在本地开发和 CI 使用。生产部署用 npm ci --omit=dev(或 --production)跳过,镜像更小、攻击面更小。构建工具(webpack)、测试框架、lint、TypeScript 通常都放这里。
注意:构建期需要但运行期也需要的包(如被直接 import 的 polyfill)仍属于 dependencies。
peerDependencies
"peerDependencies": { "react": ">=17" }
常见于插件型库(React 组件库、ESLint 插件、Babel preset):库本身不装 react,但要求使用它的项目提供。npm 7+ 会自动安装 peer 依赖并严格检查版本冲突(冲突直接报错)。
配套还有 peerDependenciesMeta 可标记可选 peer;bundledDependencies 会把指定包打进发布 tarball,较少使用。
常见问题(FAQ)
Q:devDependencies 装错到 dependencies 有影响吗?
功能上能跑,但生产镜像变大、安装变慢、引入不必要包的安全审计噪音。发布到 npm 的库尤其要避免——你的 dependencies 会强加给所有使用者。
Q:npm install 时 devDependencies 装不装?
默认装。设置 NODE_ENV=production 或加 --omit=dev 才跳过。
Q:库里同时声明 dependency 和 peerDependency 同一包?
不推荐;npm 会优先按 peer 解析。库想"自带兜底版本又允许宿主覆盖"时,更稳妥的做法是 dependency + 文档说明。