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

本地构建React项目时如何区分开发/生产环境API密钥配置?

解决本地构建React(Next.js)项目时Firebase密钥错误的问题

问题原因

执行npm run build时,Node默认会将NODE_ENV设为production,导致你的key.js逻辑切换到生产环境分支,尝试读取Vercel配置的环境变量,但本地未配置这些变量,因此抛出auth/invalid-api-key错误。

解决方案

方法一:修改构建脚本,强制本地构建使用开发环境

在项目根目录的package.json中,修改build脚本,指定NODE_ENV为development:

"scripts": {
  "build": "NODE_ENV=development next build",
  // Windows系统请使用以下命令:
  // "build": "set NODE_ENV=development && next build"
}

本地构建时会直接走key.js的开发分支,加载firebase.dev.js中的密钥。注意:此方法构建出的产物是开发环境配置,仅适合本地测试,不影响Vercel线上部署(Vercel会自动将NODE_ENV设为production)。

方法二:添加本地生产环境.env文件

在项目根目录创建.env.production文件,填入本地测试用的Firebase生产密钥:

NEXT_PUBLIC_FIREBASE_API_KEY=你的本地测试API密钥
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=你的认证域名
NEXT_PUBLIC_FIREBASE_PROJECT_ID=你的项目ID
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=你的存储桶地址
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=你的消息发送ID
NEXT_PUBLIC_FIREBASE_APP_ID=你的应用ID

Next.js会自动读取.env.production文件中的变量,本地执行npm run build时就能获取到有效密钥,无需修改key.js逻辑。

方法三:修改密钥判断逻辑,区分Vercel环境

Vercel部署时会自动设置VERCEL环境变量(值为true),利用这个变量调整key.js的判断逻辑,让非Vercel环境的生产构建也使用本地密钥:

// key.js - 根据环境和部署平台选择密钥
if (process.env.NODE_ENV === 'production' && process.env.VERCEL) {
    // Vercel生产环境,使用平台配置的环境变量
    const firebaseConfig = {
        apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
        authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
        projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
        storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
        messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
        appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
    };
    module.exports = firebaseConfig;
} else {
    // 本地开发/本地构建,使用本地dev密钥
    module.exports = require('./firebase.dev.js');
}

此方法最灵活,既保留了生产模式的构建特性,又能确保本地构建使用本地密钥,同时不影响Vercel线上部署的配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:25:16