如何避免安装 package.json 里的 devDependencies?

只装生产依赖:npm install --omit=dev(旧写法 --production);或设 NODE_ENV=production 后 npm install。部署和 Docker 构建必备。本文给出命令、Dockerfile 写法与注意事项。

最佳实践
文件、模块与依赖组织示意

用 --omit=dev(npm 7+ 支持的写法):

npm install --omit=dev

旧写法 npm install --production 仍然有效,两者等价——省略开发专用依赖的磁盘安装;运行时依赖图仍可包含optional/peer等依赖,锁文件仍解析并记录dev依赖。

用环境变量控制

# Linux/macOS
export NODE_ENV=production
npm install

# Windows PowerShell
$env:NODE_ENV="production"
npm install

NODE_ENV=production 时 npm 默认省略dev;显式--include=dev优先于omit同类依赖。注意:这同时也会改变很多框架的运行行为(如 Express 关闭详细错误页),部署时通常本来就要设。

Docker 构建里的标准写法

# 只装生产依赖,镜像更小
COPY package*.json ./
RUN npm ci --omit=dev

npm ci 按 lock 文件精确安装,配合 --omit=dev 是生产构建的黄金组合。

注意事项

  • 别把构建工具放错地方:TypeScript、esbuild、jest 这类"构建/测试需要、运行时不需要"的才放 devDependencies;如果服务器还要构建,应在构建阶段安装开发依赖;运行阶段再仅保留生产依赖;
  • 线上报错 Cannot find module:多半是某个运行时用到的包被误放进了 devDependencies,挪回去即可;
  • 检查哪些是生产依赖:npm ls --omit=dev --depth=0。

常见问题(FAQ)

Q:--omit=dev 和 --production 有区别吗?
常用场景目标相同,最终还取决于include/omit配置;omit列表含dev时生命周期脚本的NODE_ENV设为production。--production是旧写法,--omit=dev 从 npm 7 起提供更明确的写法。

Q:全局安装也受 NODE_ENV 影响吗?
全局安装不会把当前项目devDependencies作为安装目标,但被安装包的依赖图和生命周期仍受相应配置影响,不能概括为所有环境变量都无效。

Q:想连 dependencies 里的可选依赖也不装?
加 --omit=optional。可以叠加:npm ci --omit=dev --omit=optional。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台