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

Gatsby无法设置环境变量问题求助

解决Gatsby多环境变量配置失效问题

我之前在配置Gatsby多环境变量时也踩过几乎一模一样的坑,咱们从几个关键环节排查修复:

1. 确保环境变量跨系统正常传递

你的部署脚本里用了DEPLOY_ENV=staging这种写法,这在Mac/Linux等Unix-like系统下没问题,但在Windows系统中会直接失效。解决办法是用cross-env包统一跨系统的环境变量设置逻辑:

首先安装依赖:

npm install cross-env --save-dev

然后修改package.json里的部署脚本:

"deploy:staging": "cross-env DEPLOY_ENV=staging gatsby build --prefix-paths && s3-deploy ..."

2. 让环境变量同时在Node和浏览器环境生效

你在gatsby-config.js里用dotenv加载了变量,但这些变量默认只在Node环境(比如gatsby-config、gatsby-node.js这类构建脚本)可用,像src/html.js这种浏览器端的文件是拿不到的。这里给你两种可行的传递方案:

方案A:通过siteMetadata传递

在gatsby-config.js里把需要的变量注入到站点元数据中:

require("dotenv").config({ path: `.env.${process.env.DEPLOY_ENV}` });

module.exports = {
  siteMetadata: {
    assetHost: process.env.ASSET_HOST,
  },
  // 其他原有配置...
};

然后在src/html.js里通过静态查询获取该变量:

import { useStaticQuery, graphql } from "gatsby";

const Html = ({ ...props }) => {
  const siteData = useStaticQuery(graphql`
    query {
      site {
        siteMetadata {
          assetHost
        }
      }
    }
  `);
  
  return (
    // 原有html结构...
    <script src={`//${siteData.site.siteMetadata.assetHost}/app.js`}></script>
    // 原有html结构...
  );
};

方案B:用Gatsby插件直接暴露给浏览器

安装专门的环境变量插件:

npm install gatsby-plugin-env-variables --save-dev

然后在gatsby-config.js里配置允许暴露给浏览器的变量列表:

require("dotenv").config({ path: `.env.${process.env.DEPLOY_ENV}` });

module.exports = {
  // 其他原有配置...
  plugins: [
    // 其他原有插件...
    {
      resolve: `gatsby-plugin-env-variables`,
      options: {
        allowList: ["ASSET_HOST"]
      }
    }
  ]
};

配置完成后,你就能在src/html.js里直接使用process.env.ASSET_HOST了。

3. 验证dotenv的加载路径是否正确

有时候看似路径正确,但实际当前工作目录不是项目根目录,导致dotenv找不到对应的.env文件。可以在gatsby-config.js里打印完整路径确认:

const path = require('path');
const envFilePath = path.resolve(__dirname, `.env.${process.env.DEPLOY_ENV}`);
console.log(`当前加载的环境变量文件路径:${envFilePath}`);
require("dotenv").config({ path: envFilePath });

如果打印的路径不对,改成绝对路径就能解决问题。

4. 确认.env文件的格式正确

检查你的.env.staging等文件,确保变量格式是ASSET_HOST=your-host-domain.com——不要加引号,也不要在等号前后加多余空格,否则dotenv无法正确解析。

按照上面的步骤调整后,应该就能正常加载对应环境的变量了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:23