You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NX 15.8+NestJs9构建后process.env.NODE_ENV被替换,如何保留原写法?

解决NX构建时process.env.NODE_ENV被硬编码的问题

这个问题确实是Webpack的DefinePlugin导致的——NX默认集成了这个插件,构建时会把代码里的process.env.NODE_ENV直接替换成构建时的固定值(比如你看到的"development"),目的是优化代码、剔除不必要的环境判断分支。要保留原写法,让程序启动时自行读取环境变量,可以试试下面几种方案:

方案一:自定义Webpack配置,移除NODE_ENV的硬编码替换

  1. 找到项目根目录下的project.json(或workspace.json,取决于NX版本),定位到对应NestJS项目的build配置项,在options里添加webpackConfig字段,指向自定义配置文件:
    "build": {
      "executor": "@nrwl/node:build",
      "options": {
        "webpackConfig": "apps/[你的项目名]/webpack.config.js",
        // 其他原有配置...
      }
    }
    
  2. 在指定路径创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:52:10