NX 15.8+NestJs9构建后process.env.NODE_ENV被替换,如何保留原写法?
解决NX构建时process.env.NODE_ENV被硬编码的问题
这个问题确实是Webpack的DefinePlugin导致的——NX默认集成了这个插件,构建时会把代码里的process.env.NODE_ENV直接替换成构建时的固定值(比如你看到的"development"),目的是优化代码、剔除不必要的环境判断分支。要保留原写法,让程序启动时自行读取环境变量,可以试试下面几种方案:
方案一:自定义Webpack配置,移除NODE_ENV的硬编码替换
- 找到项目根目录下的
project.json(或workspace.json,取决于NX版本),定位到对应NestJS项目的build配置项,在options里添加webpackConfig字段,指向自定义配置文件:"build": { "executor": "@nrwl/node:build", "options": { "webpackConfig": "apps/[你的项目名]/webpack.config.js", // 其他原有配置... } } - 在指定路径创建
webpack.config.js,写入以下内容:const { composePlugins, withNx } = require('@nrwl/webpack'); module.exports = composePlugins(withNx(), (config) => { // 遍历插件,移除对NODE_ENV的硬编码替换 config.plugins = config.plugins.map(plugin => { if (plugin.definitions?.['process.env.NODE_ENV']) { delete plugin.definitions['process.env.NODE_ENV']; } return plugin; }); return config; });
方案二:用函数包裹读取逻辑,规避Webpack静态分析
如果不想修改Webpack配置,可以通过函数调用的方式,让Webpack无法静态分析出要替换的变量:
export function boot(): void { const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; process.env.TZ = timezone; // 用函数包裹,避免被静态替换 const getNodeEnv = () => process.env.NODE_ENV; const NODE_ENV = getNodeEnv(); ... }
方案三:检查NX环境变量配置
- 确认项目根目录或应用目录下的
.env文件里,有没有硬编码的NODE_ENV值,如果有直接删除; - 检查
nx.json里的构建命令参数,确保没有固定传递NODE_ENV=development这类值。
完成配置后重新构建项目,查看生成的main.js,就能看到const NODE_ENV = process.env.NODE_ENV;的原写法被保留,启动时会自行读取环境变量。
内容的提问来源于stack exchange,提问作者Makuna
相关产品推荐
相关产品推荐

