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 + 文档说明。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台