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

在Create React App+Firebase的Service Worker中使用.env环境变量

解决Create React App中Firebase Messaging Service Worker的多环境配置问题

针对你用react-scripts@4.0.3构建的项目,不想改动CRA内置的Webpack/Babel配置,同时要解决Firebase配置硬编码、多环境维护繁琐的问题,推荐以下无需修改CRA核心配置的方案:

步骤1:配置环境变量

在项目根目录创建对应环境的.env文件(比如.env.development、.env.production),将Firebase配置项以REACT_APP_前缀定义:

# .env.production示例
REACT_APP_FIREBASE_API_KEY=你的生产环境API密钥
REACT_APP_FIREBASE_AUTH_DOMAIN=你的生产环境Auth域名
REACT_APP_FIREBASE_DATABASE_URL=你的生产环境数据库URL
REACT_APP_FIREBASE_PROJECT_ID=你的生产环境项目ID
REACT_APP_FIREBASE_STORAGE_BUCKET=你的生产环境存储桶
REACT_APP_FIREBASE_MESSAGING_SENDER_ID=你的生产环境消息发送者ID
REACT_APP_FIREBASE_APP_ID=你的生产环境App ID

步骤2:编写自动生成Service Worker的脚本

在项目根目录创建scripts/generate-firebase-sw.js脚本,用于读取环境变量并生成public/firebase-messaging-sw.js:

const fs = require('fs');
const path = require('path');

// 从环境变量中读取Firebase配置
const firebaseConfig = {
  apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
  authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
  databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,
  projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
  storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
  appId: process.env.REACT_APP_FIREBASE_APP_ID,
};

// 构造Service Worker内容
const swContent = `importScripts('https://www.gstatic.com/firebasejs/8.2.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/8.2.0/firebase-messaging.js');

const firebaseConfig = ${JSON.stringify(firebaseConfig, null, 4)};

firebase.initializeApp(firebaseConfig);

const messaging = firebase.messaging();
messaging.onBackgroundMessage(function (message) {  
    return self.registration.showNotification(
        message.notification.title || "默认标题",
        message.notification.options || { body: "默认消息内容" }
    );
});
`;

// 将内容写入public目录下的Service Worker文件
const targetPath = path.join(__dirname, '../public/firebase-messaging-sw.js');
fs.writeFileSync(targetPath, swContent);
console.log('✅ 已根据当前环境生成firebase-messaging-sw.js');

步骤3:配置NPM脚本钩子

修改package.json的scripts字段,添加prestart和prebuild钩子,让脚本在启动或构建项目前自动执行:

{
  "scripts": {
    "prestart": "node scripts/generate-firebase-sw.js",
    "prebuild": "node scripts/generate-firebase-sw.js",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  }
}

步骤4:忽略自动生成的文件

将自动生成的firebase-messaging-sw.js添加到.gitignore,避免提交到版本库:

public/firebase-messaging-sw.js

方案优势

  • 完全遵循CRA的环境变量规范,无需修改内置Webpack/Babel配置
  • 多环境配置通过.env文件管理,维护更清晰
  • 利用NPM预钩子自动生成Service Worker,无需手动操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02