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

Next.js 13中使用动态键访问环境变量返回Undefined问题

Next.js 13客户端组件动态读取.env变量返回undefined的解决方案

问题根源

Next.js 13对客户端环境变量采用构建时静态替换机制:只有明确写出的process.env.NEXT_PUBLIC_XXX会被替换为实际值。动态拼接的变量名(比如process.env[NEXT_PUBLIC_YANDEX_METRIKA_${page_}])因为构建阶段无法确定具体键名,不会被工具识别并替换,所以客户端运行时process.env中不存在该键,返回undefined。


解决方案

方案1:提前映射所有可能的环境变量

手动创建映射对象,静态引用所有需要的环境变量,确保构建工具能识别替换,之后即可通过动态键访问:

const YandexMetrika: React.FC<YandexMetrikaProps> = ({ page }) => {
  // 静态定义所有页面对应的埋点ID映射
  const metrikaIdMap = {
    HOME: process.env.NEXT_PUBLIC_YANDEX_METRIKA_HOME,
    ABOUT: process.env.NEXT_PUBLIC_YANDEX_METRIKA_ABOUT,
    PRODUCT: process.env.NEXT_PUBLIC_YANDEX_METRIKA_PRODUCT,
    // 补充其他页面类型...
  };

  if (!page) return null;

  // 类型断言确保键名安全
  const currentMetrikaId = metrikaIdMap[page as keyof typeof metrikaIdMap];
  console.log(currentMetrikaId); // 正常获取值

  return null;
};

方案2:在next.config.js中批量注入环境变量

如果页面类型较多,可在配置文件中批量收集相关环境变量,客户端就能直接动态访问:

// next.config.js
module.exports = {
  env: {
    // 筛选并注入所有NEXT_PUBLIC_YANDEX_METRIKA_开头的变量
    ...Object.fromEntries(
      Object.entries(process.env).filter(([key]) => 
        key.startsWith("NEXT_PUBLIC_YANDEX_METRIKA_")
      )
    ),
  },
};

之后客户端组件可直接动态拼接键名:

const YandexMetrika: React.FC<YandexMetrikaProps> = ({ page }) => {
  if (!page) return null;

  const currentMetrikaId = process.env[`NEXT_PUBLIC_YANDEX_METRIKA_${page}`];
  console.log(currentMetrikaId); // 正常获取值

  return null;
};

额外优化:简化代码逻辑

你的代码中用useState和useEffect存储page是多余的,直接使用props传入的page即可,减少不必要的状态流转。


内容的提问来源于stack exchange,提问作者Kovbenya Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:21:09