Skip to main content

Firebase功能:Realtime Database

步驟一:在 Firebase 控制台設定專案

  1. 前往 Firebase 控制台

    • 開啟瀏覽器,前往 Firebase 控制台

    • 點擊「新增專案」,輸入專案名稱(例如 todo-list-app),然後點擊「繼續」。

    • 關閉 Google Analytics(這是可選的,為了簡化教學我們先關閉),然後點擊「建立專案」。

  2. 新增 Web 應用程式

    • 在 Firebase 控制台的專案概覽頁面,點擊「新增應用程式」並選擇「Web(</>)」。

    • 輸入應用程式名稱(例如 Todo List),不需要勾選「設定 Firebase Hosting」。

    • 點擊「註冊應用程式」,Firebase 會提供一組設定物件(firebaseConfig),看起來像這樣:

      const firebaseConfig = {
      apiKey: "你的-api-key",
      authDomain: "你的專案-id.firebaseapp.com",
      databaseURL: "https://你的專案-id.firebaseio.com",
      projectId: "你的專案-id",
      storageBucket: "你的專案-id.appspot.com",
      messagingSenderId: "你的-messaging-sender-id",
      appId: "你的-app-id"
      };
    • 複製這段程式碼,稍後會用到。

  3. 啟用 Realtime Database

    • 在 Firebase 控制台左側選單,點擊「建置」 > 「Realtime Database」。

    • 點擊「建立資料庫」,選擇你所在的區域(例如 us-central1)。

    • 選擇「開始模式:測試模式」(允許讀寫,適合開發階段)。注意:測試模式會允許任何人讀寫資料,正式上線前需設定安全規則。


步驟二:安裝並初始化 Firebase

  1. 安裝 Firebase

    • 在專案目錄的終端機中,執行以下指令安裝 Firebase:

      npm install firebase
  2. 建立 Firebase 設定檔案

    • 在 src 資料夾中建立一個新檔案,命名為 firebase.js。

    • 將 Firebase 控制台提供的 firebaseConfig 貼到檔案中,並加入初始化程式碼。完整程式碼如下:

      // src/firebase.js
      import { initializeApp } from "firebase/app";
      import { getDatabase } from "firebase/database";

      // 你的 Firebase 設定物件
      const firebaseConfig = {
      apiKey: "你的-api-key",
      authDomain: "你的專案-id.firebaseapp.com",
      databaseURL: "https://你的專案-id.firebaseio.com",
      projectId: "你的專案-id",
      storageBucket: "你的專案-id.appspot.com",
      messagingSenderId: "你的-messaging-sender-id",
      appId: "你的-app-id"
      };

      // 初始化 Firebase
      const app = initializeApp(firebaseConfig);

      // 初始化 Realtime Database
      const database = getDatabase(app);

      // 匯出 database 供其他元件使用
      export { database };
    • 注意:請將 firebaseConfig 中的值替換成你在 Firebase 控制台取得的實際值。

  3. 設定環境變數(可選,但建議)

    • 為了安全起見,建議將 Firebase 設定儲存在環境變數中,而不是直接寫在程式碼中。

    • 在專案根目錄建立一個 .env 檔案,加入以下內容:

      VITE_FIREBASE_API_KEY=你的-api-key
      VITE_FIREBASE_AUTH_DOMAIN=你的專案-id.firebaseapp.com
      VITE_FIREBASE_DATABASE_URL=https://你的專案-id.firebaseio.com
      VITE_FIREBASE_PROJECT_ID=你的專案-id
      VITE_FIREBASE_STORAGE_BUCKET=你的專案-id.appspot.com
      VITE_FIREBASE_MESSAGING_SENDER_ID=你的-messaging-sender-id
      VITE_FIREBASE_APP_ID=你的-app-id
    • 修改 src/firebase.js,使用環境變數:

      // src/firebase.js
      import { initializeApp } from "firebase/app";
      import { getDatabase } from "firebase/database";

      const firebaseConfig = {
      apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
      authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
      databaseURL: import.meta.env.VITE_FIREBASE_DATABASE_URL,
      projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
      storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET,
      messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID,
      appId: import.meta.env.VITE_FIREBASE_APP_ID
      };

      const app = initializeApp(firebaseConfig);
      const database = getDatabase(app);

      export { database };
    • 將 .env 加入 .gitignore,避免將敏感資訊上傳到公開的 Git 儲存庫。


步驟三:實現簡單的 Todo List 元件

我們將建立一個簡單的待辦事項清單,實現新增、讀取和刪除功能。

  1. 修改 App 元件

    • 打開 src/App.jsx,替換為以下程式碼:

      // src/App.jsx
      import { useState, useEffect } from "react";
      import { database } from "./firebase";
      import { ref, push, onValue, remove } from "firebase/database";
      import "./App.css";

      function App() {
      const [todos, setTodos] = useState([]);
      const [newTodo, setNewTodo] = useState("");

      // 讀取資料
      useEffect(() => {
      const todosRef = ref(database, "todos");
      onValue(todosRef, (snapshot) => {
      const data = snapshot.val();
      const todosArray = data
      ? Object.keys(data).map((key) => ({
      id: key,
      text: data[key].text
      }))
      : [];
      setTodos(todosArray);
      });
      }, []);

      // 新增待辦事項
      const handleAddTodo = () => {
      if (newTodo.trim() === "") return;
      const todosRef = ref(database, "todos");
      push(todosRef, { text: newTodo });
      setNewTodo("");
      };

      // 刪除待辦事項
      const handleDeleteTodo = (id) => {
      const todoRef = ref(database, `todos/${id}`);
      remove(todoRef);
      };

      return (
      <div className="App">
      <h1>待辦事項清單</h1>
      <div>
      <input
      type="text"
      value={newTodo}
      onChange={(e) => setNewTodo(e.target.value)}
      placeholder="輸入新的待辦事項"
      />
      <button onClick={handleAddTodo}>新增</button>
      </div>
      <ul>
      {todos.map((todo) => (
      <li key={todo.id}>
      {todo.text}
      <button onClick={() => handleDeleteTodo(todo.id)}>刪除</button>
      </li>
      ))}
      </ul>
      </div>
      );
      }

      export default App;
  2. 說明程式碼

    • useState:管理輸入框的文字(newTodo)和待辦事項清單(todos)。

    • useEffect:使用 onValue 監聽 Firebase Realtime Database 的 todos 節點,當資料改變時更新狀態。

    • handleAddTodo:使用 push 將新待辦事項寫入資料庫。

    • handleDeleteTodo:使用 remove 刪除指定的待辦事項。

    • 資料結構在 Firebase 中會儲存為:

      {
      "todos": {
      "隨機ID1": { "text": "買牛奶" },
      "隨機ID2": { "text": "寫程式" }
      }
      }

步驟四:測試應用程式

  1. 啟動專案

    npm run dev

    開啟瀏覽器,前往 http://localhost:5173 ,你應該能看到:

    • 一個輸入框和「新增」按鈕。

    • 輸入文字後點擊「新增」,待辦事項會出現在清單中。

    • 點擊「刪除」按鈕可以移除對應的待辦事項。

  2. 檢查 Firebase 控制台

    • 回到 Firebase 控制台的「Realtime Database」頁面,點擊「資料」標籤。

    • 你應該能看到 todos 節點下儲存了你新增的待辦事項。

重要提醒

  • 安全性規則:目前 Realtime Database 處於測試模式,允許任何人讀寫資料。正式上線前,務必在 Firebase 控制台的「Realtime Database」 > 「規則」設定適當的安全規則,例如:

    {
    "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
    }
    }

    這表示只有經過身份驗證的使用者才能讀寫資料。

  • 環境變數:如前所述,使用 .env 檔案儲存 Firebase 設定,避免將敏感資訊直接寫在程式碼中。


常見問題與除錯

  1. 錯誤:Firebase: No Firebase App '[DEFAULT]' has been created

    • 檢查 firebase.js 是否正確初始化 Firebase。

    • 確保 firebaseConfig 中的值正確。

  2. 資料沒有即時更新

    • 確認 onValue 監聽器是否正確設定,且指向正確的資料庫路徑。

    • 檢查網路連線是否正常。

  3. 部署後頁面空白

    • 確認 firebase.json 中的 public 設為 dist。

    • 確認已執行 npm run build。