如何避免安装 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 仍然有效,两者等价——只装 dependencies,跳过 devDependencies。
用环境变量控制
# Linux/macOS
export NODE_ENV=production
npm install
# Windows PowerShell
$env:NODE_ENV="production"
npm install
NODE_ENV=production 时 npm 默认跳过 devDependencies。注意:这同时也会改变很多框架的运行行为(如 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 有区别吗?
没有功能区别,--production 是旧名称,--omit=dev 从 npm 7 起提供更明确的写法。
Q:全局安装也受 NODE_ENV 影响吗?
不受影响,npm install -g 不涉及 devDependencies 概念。
Q:想连 dependencies 里的可选依赖也不装?
加 --omit=optional。可以叠加:npm ci --omit=dev --omit=optional。