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

使用NX时React应用无法读取环境变量的问题排查

问题:NX Monorepo中React应用无法读取环境变量

问题背景

使用NX管理包含React应用与NestJS应用的monorepo时,NestJS应用本地和部署后都能正常读取环境变量,但React应用中process.env为空对象,environment.ts中定义的变量始终返回undefined。Webpack构建配置中能正常打印环境变量,但客户端代码无法获取。

项目结构

/nx-monorepo
  /apps
    /react-app
      /src
        /environments
          environment.ts
          environment.prod.ts
      .env
      ...
      webpack.config.js
    /nest-app
      /src
      .env
  nx.json
  package.json

现有配置

Webpack配置(webpack.config.js)

const { composePlugins, withNx } = require('@nx/webpack');
const { withReact } = require('@nx/react');

module.exports = composePlugins(withNx(), withReact(), (config) => {        
  console.log('Environment Variables:')
  console.log('NX_FLYOUT_SERVICE_URL: ', process.env.NX_FLYOUT_SERVICE_URL);
  console.log('NX_IS_PRE_RELEASE: ', process.env.NX_IS_PRE_RELEASE);
  console.log('NX_GOOGLE_MAPS_API_KEY: ', process.env.NX_GOOGLE_MAPS_API_KEY);

  return config;
});

环境文件(environment.ts)

type Environment = {
  production: boolean;
  flyoutServiceUrl: string | undefined;
  isPreRelease: boolean;
}

export const environment: Environment = {
  production: false,
  flyoutServiceUrl: process.env.NX_FLYOUT_SERVICE_URL,
  isPreRelease: process.env.NX_IS_PRE_RELEASE === 'true'
};

现象

  • Webpack构建阶段能正常打印NX_前缀的环境变量
  • React应用客户端代码中,process.env为空对象,environment返回{production: false, flyoutServiceUrl: undefined, isPreRelease: false}

解决方法

1. 显式配置Webpack的DefinePlugin

withNx()插件理论上会自动注入环境变量,但部分场景下需要手动配置确保变量被替换到客户端代码。修改webpack.config.js:

const { composePlugins, withNx } = require('@nx/webpack');
const { withReact } = require('@nx/react');
const webpack = require('webpack');

module.exports = composePlugins(withNx(), withReact(), (config) => {        
  console.log('Environment Variables:')
  console.log('NX_FLYOUT_SERVICE_URL: ', process.env.NX_FLYOUT_SERVICE_URL);
  console.log('NX_IS_PRE_RELEASE: ', process.env.NX_IS_PRE_RELEASE);
  console.log('NX_GOOGLE_MAPS_API_KEY: ', process.env.NX_GOOGLE_MAPS_API_KEY);

  // 显式注入NX前缀的环境变量到客户端
  config.plugins.push(
    new webpack.DefinePlugin({
      'process.env.NX_FLYOUT_SERVICE_URL': JSON.stringify(process.env.NX_FLYOUT_SERVICE_URL),
      'process.env.NX_IS_PRE_RELEASE': JSON.stringify(process.env.NX_IS_PRE_RELEASE),
      'process.env.NX_GOOGLE_MAPS_API_KEY': JSON.stringify(process.env.NX_GOOGLE_MAPS_API_KEY),
    })
  );

  return config;
});

2. 检查.env文件加载规则

  • NX优先加载项目根目录的.env,再加载应用目录下的.env,确保变量定义在正确的文件中
  • .env文件中变量无需加export,直接写NX_FLYOUT_SERVICE_URL=https://example.com即可

3. 确认命令行传参格式

如果通过命令行临时传递变量,需使用正确格式:

# 开发服务启动
NX_FLYOUT_SERVICE_URL=https://dev.example.com nx serve react-app

# 生产构建
NX_FLYOUT_SERVICE_URL=https://prod.example.com nx build react-app --prod

4. 清除NX缓存

缓存可能导致旧环境变量残留,执行以下命令清除:

nx reset

之后重新启动服务或构建应用。

5. 验证环境文件导入路径

确保React组件中导入的是正确的环境文件:

import { environment } from './environments/environment';

避免在开发环境误导入environment.prod.ts。


内容的提问来源于stack exchange,提问作者Adam Piper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:13:15