npm install何时安装/跳过devDependencies及相关问题咨询
我太懂这种困惑了——用了npm好几年,却还是会在依赖安装规则上踩坑,尤其是嵌套依赖的情况。先帮你理清你遇到的那个具体问题,再给你一张清晰的对照表,彻底搞明白不同场景下devDependencies的安装逻辑。
先解决你的测试疑问
你提到把eslint放进项目的dependencies,执行npm install --production后,发现eslint的“devDependencies”被安装了——其实这里是个误解:npm只会跳过当前项目根目录的devDependencies,而对于嵌套依赖(也就是你依赖的包的依赖),它只会安装该包自身的dependencies,不会安装该包的devDependencies。你看到的那些被安装的包,其实是eslint自己的dependencies(比如espree、eslint-utils这类它运行必须的依赖),而非它的devDependencies。你可以去eslint的官方package.json里核对一下,就能明白这一点。
如果想让eslint的依赖完全不进入生产环境,你应该把eslint放进项目的devDependencies里,这样npm install --production就会直接跳过eslint,自然也不会安装它的任何依赖了。
npm 依赖安装场景对照表
下面整理了所有常见场景下的devDependencies安装规则,核心记住两点:
- 只有当前项目根目录的devDependencies会根据命令参数决定是否安装
- 任何嵌套依赖(你依赖的包的依赖)只会安装它们自身的
dependencies,永远不会安装它们的devDependencies
1. 常规本地开发安装
- 命令:
npm install(无任何参数) - 行为:安装当前项目的所有dependencies + devDependencies
- 适用场景:本地写代码、调试项目时
2. 生产环境安装
- 命令:
npm install --production,或者先设置环境变量NODE_ENV=production再执行npm install - 行为:仅安装当前项目的
dependencies,完全跳过当前项目的devDependencies - 适用场景:部署到服务器、构建生产镜像等不需要开发工具的场景
3. 单独安装某个包
- 情况A:安装为生产依赖
- 命令:
npm install <包名>(默认)或npm install <包名> --save - 行为:把包添加到当前项目的
dependencies,同时安装该包自身的dependencies(不装它的devDependencies)
- 命令:
- 情况B:安装为开发依赖
- 命令:
npm install <包名> --save-dev(简写npm i <包名> -D) - 行为:把包添加到当前项目的
devDependencies,同时安装该包自身的dependencies(不装它的devDependencies)
- 命令:
4. 全局安装包
- 命令:
npm install <包名> -g - 行为:全局安装该包,仅安装它自身的
dependencies,不会安装它的devDependencies - 适用场景:安装全局命令行工具(比如eslint、vue-cli这类)
5. CI/CD环境安装
- 大部分CI环境会默认设置
NODE_ENV=production,所以行为和npm install --production一致,只装dependencies - 如果CI中需要运行测试、lint这类任务,需要显式执行
npm install(无参数),或者手动设置NODE_ENV=development
内容的提问来源于stack exchange,提问作者XGHeaven
相关产品推荐
相关产品推荐

