dependencies是生产环境运行必需的代码依赖,如express、react;devDependencies仅用于开发构建测试,如webpack、jest,npm install --production时不会安装。

本质区别在于运行阶段和部署场景不同:dependencies 是项目在生产环境运行时真正需要的代码依赖,而 devDependencies 只参与开发、构建、测试过程,不会进入最终运行时。
什么时候会被实际加载执行
dependencies 中的包会在 Node.js 启动服务、或浏览器加载前端应用时被 require 或 import,直接参与业务逻辑。比如 express 处理 HTTP 请求,react 渲染 UI,axios 发起 API 调用——这些都必须存在,否则程序直接报错。
devDependencies 中的包(如 webpack、jest、eslint)只在你本地执行 npm run build、npm test 或 npm run lint 时被调用,它们本身不输出到浏览器或服务器进程里,也不会被打包进最终的 dist 或 bundle.js 中(除非你显式 import 它们的运行时部分,但这是反模式)。
安装行为和部署影响
- npm install:默认同时装 dependencies 和 devDependencies
- npm install --production:只装 dependencies,跳过所有 devDependencies
- CI/CD 部署脚本通常加
--production,因此 devDependencies 根本不会出现在线上服务器的node_modules里 - 这意味着:写错位置会导致线上崩溃(该装没装),或浪费资源(不该装却装了)
判断一个包该放哪的简单标准
问自己一个问题:这个包的代码,是否在用户访问网站或服务启动后,仍被 Node.js 进程或浏览器 JavaScript 引擎执行?
- 是 → 放
dependencies(例如:lodash的_.debounce在页面滚动节流中运行) - 否 → 放
devDependencies(例如:typescript只在本地编译时运行,产出的是纯 JS,它自己不进线上环境) - 边界情况注意:
@types/react是类型声明,不运行,纯开发用;react-dom是运行时必需,必须放 dependencies
不是“开发用”和“生产用”的字面意思
别被 “dev” 字母误导。比如 nodemon 确实只在开发时重启服务,但它不参与构建也不生成产物,只是个命令行工具,属于典型 devDependency;而 cross-env 常用于 scripts 中兼容不同系统环境变量,也属于 devDependencies——它从不被你的业务代码 import,只被 npm script 调用。
反过来,有些工具看似“开发向”,但如果它的代码片段最终会进入 bundle 并执行(比如某些 Babel 插件注入的辅助函数),那它本身仍是 devDependency,但它的产出效果会影响运行时——这正说明:区分依据不是“谁在用”,而是“谁在跑”。


















