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" }
生产环境运行必需。一般安装会解析并安装,仍受 omit/optional/platform 等配置影响;并非任何命令参数下都保证落盘;别人把你的包当依赖装时,这些也会被连带安装。放错了会导致生产缺包崩溃,或把测试库带进生产镜像。
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,冲突可能警告或报错,取决于依赖关系和 strict-peer-deps 等配置。
配套还有 peerDependenciesMeta 可标记可选 peer;bundledDependencies 会把指定包打进发布 tarball,较少使用。
常见问题(FAQ)
Q:devDependencies 装错到 dependencies 有影响吗?
功能上能跑,但生产镜像变大、安装变慢、引入不必要包的安全审计噪音。发布到 npm 的库尤其要避免——你的 dependencies 会强加给所有使用者。
Q:npm install 时 devDependencies 装不装?
根项目默认通常安装;NODE_ENV=production 默认 omit dev,也可由配置/--include=dev 等覆盖。消费者不会安装已发布依赖包自身的 devDependencies。省略落盘不代表 lockfile 中不解析/记录。
Q:库里同时声明 dependency 和 peerDependency 同一包?
需明确是否要求与宿主共享同一实例。dependency 不保证宿主可覆盖且可能产生第二份;插件通常声明 peerDependencies,并用 devDependencies 支持自身测试,不应把 dependency + 文档当通用兜底。