Angular Universal如何正确设置NODE_ENV为production
Angular 13 Universal Express 固定NODE_ENV为development的解决方案
核心原因
- 跨平台环境变量写法不兼容:直接在npm脚本中写
NODE_ENV=production仅支持macOS/Linux类Unix系统,Windows默认无法识别该语法 - Angular Universal开发服务默认覆写变量:执行
ng serve、npm run dev:ssr这类本地开发命令时,@nguniversal/express-engine的构建器会主动将process.env.NODE_ENV重置为development,外部传入的参数优先级低于内部逻辑,因此不会生效。
分场景解决
生产环境部署(推荐方案)
生产环境不要使用开发服务启动项目,按以下步骤操作:
- 执行带生产配置的SSR构建命令
npm run build:ssr -- --configuration production
必须携带--configuration production参数,否则Angular会默认使用development配置完成构建。
2. 启动构建后的服务端产物,启动时手动指定NODE_ENV:
- macOS/Linux系统:
NODE_ENV=production node dist/[你的项目名称]/server/main.js
- Windows cmd环境:
set NODE_ENV=production && node dist/[你的项目名称]/server/main.js
- Windows PowerShell环境:
$env:NODE_ENV="production"; node dist/[你的项目名称]/server/main.js
- 跨平台兼容写法(无需区分操作系统,推荐)
先安装跨平台环境变量工具:
npm install cross-env --save-dev
在package.json的scripts字段中新增生产启动脚本:
"start:prod:ssr": "cross-env NODE_ENV=production node dist/[你的项目名称]/server/main.js"
后续直接执行npm run start:prod:ssr即可正常启动生产模式的SSR服务,此时打印process.env.NODE_ENV会输出production。
本地调试临时模拟production模式
如果需要在本地开发阶段临时将NODE_ENV设为production,不要修改npm脚本参数,直接打开项目根目录下的server.ts文件,将环境变量赋值代码放在所有导入语句的最顶部,优先于其他所有逻辑执行:
// server.ts 最顶部,所有import之前写 process.env.NODE_ENV = 'production'; // 原有代码保留,例如import 'zone.js/node'、express初始化逻辑等
注意:硬编码环境变量仅用于本地调试,生产环境请删除该段硬编码,通过启动参数传入环境变量,避免后续多环境部署出现配置冲突。
内容的提问来源于stack exchange,提问作者Kaloyan Stamatov
相关产品推荐
相关产品推荐

