javascript项目依赖管理核心是精准声明与安装:production依赖(如react)写入dependencies,用npm install默认安装;dev依赖(如eslint)须加-d写入devdependencies;peer依赖(如react-router-dom要求的react)需手动显式安装并满足版本契约。

JavaScript 项目中不同环境(开发、测试、生产)依赖不同,靠手动区分极易出错。核心不是“怎么装”,而是“怎么声明+怎么装对”。关键在 package.json 的字段划分和安装命令的精准使用。
明确三类依赖的语义和写入位置
npm 不靠环境变量或配置文件切换依赖,而是靠 dependencies、devDependencies 和 peerDependencies 这三个字段表达意图:
-
production 依赖:运行时必需,比如
react、axios、express。用npm install axios默认写入dependencies,部署时必须存在 -
dev 依赖:只在本地开发/构建/测试时用,如
vite、jest、eslint。必须加-D或--save-dev,例如npm install eslint -D,写入devDependencies;上线时可跳过安装 -
peer 依赖:不自动安装,是“契约声明”,常见于插件或组件库,比如
eslint-plugin-react声明"react": "^18.0.0"。你得自己显式执行npm install react@18.2.0,否则运行时可能报错或功能异常
部署时自动过滤非生产依赖
生产环境不需要 lint 工具或测试框架,体积和启动速度都受影响。npm 提供了原生支持:
- 执行
npm install --production:只安装dependencies中的包,完全忽略devDependencies - CI/CD 流程中推荐用
npm ci --only=production:更快、更确定,且严格按package-lock.json还原,不读package.json的版本范围 - 注意:
optionalDependencies是特例——安装失败不中断流程(如fsevents只在 macOS 生效),适合做平台兼容性兜底,但不用于环境区分
避免常见混淆点
很多问题其实源于对“环境”二字的误解:
-
没有 “testDependencies” 字段:测试工具(如
jest)就放在devDependencies里,测试脚本通过scripts.test调用即可 -
全局安装(
-g)≠ 环境依赖:全局装的是 CLI 工具(如http-server),不影响项目内部依赖树,不能替代本地devDependencies -
不要靠
NODE_ENV控制安装行为:这个变量影响的是运行时逻辑(如 React 开发模式警告),和依赖安装无关;npm 安装过程完全不读它
验证和排查依赖是否装对
装完不确定?几个简单命令帮你快速确认:
-
npm list --depth=0:看一级依赖是否齐全,有没有误把lodash装进devDependencies -
npm ls react:查实际解析到哪个版本,是否满足 peer 要求 -
npm install --dry-run:模拟安装,预览会装哪些包、写入哪个字段,不真实改动
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











