Модуль @nuxtjs/firebase в Nuxt
Модуль @nuxtjs/firebase упрощает интеграцию Firebase сервисов (таких как Authentication, Firestore, Realtime Database, Storage, Functions и др.) в ваши Nuxt 3 приложения. Он предоставляет удобный способ инициализации Firebase и доступа к его SDK из любой части вашего приложения.
Важно: Этот модуль является сторонним и не поддерживается непосредственно командой Nuxt или Google. Однако он широко используется и поддерживается сообществом.
Установка
Для начала установите модуль @nuxtjs/firebase:
npm install --save @nuxtjs/firebase
# или
yarn add @nuxtjs/firebaseЗатем добавьте @nuxtjs/firebase в секцию modules вашего файла nuxt.config.ts (или nuxt.config.js):
export default defineNuxtConfig({
modules: [
'@nuxtjs/firebase',
],
firebase: {
// Настройки модуля (см. ниже)
config: {
apiKey: process.env.FIREBASE_API_KEY,
authDomain: process.env.FIREBASE_AUTH_DOMAIN,
projectId: process.env.FIREBASE_PROJECT_ID,
storageBucket: process.env.FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.FIREBASE_APP_ID,
// measurementId: process.env.FIREBASE_MEASUREMENT_ID // Optional
},
services: {
auth: true, // Включить Firebase Authentication
firestore: true, // Включить Cloud Firestore
realtimeDatabase: true, // Включить Realtime Database
storage: true, // Включить Firebase Storage
functions: true, // Включить Cloud Functions
messaging: true, // Включить Firebase Cloud Messaging
analytics: true, // Включить Google Analytics for Firebase
performance: true, // Включить Firebase Performance Monitoring
remoteConfig: true, // Включить Firebase Remote Config
},
// emulatorPort: 9099, // Порт для эмулятора Authentication (пример)
// emulatorHost: 'localhost', // Хост для эмуляторов
// ... другие настройки
},
// ... другие настройки
});Настройка (nuxt.config.ts)
В секции firebase вашего nuxt.config.ts вы настраиваете модуль.
Основные опции:
config(обязательно): Объект с конфигурацией вашего Firebase проекта. Эти значения обычно берутся из настроек вашего Firebase проекта (консоль Firebase -> Настройки проекта -> Ваши приложения). Рекомендуется хранить эти значения в переменных окружения (.env).services(обязательно): Объект, определяющий, какие Firebase сервисы вы хотите использовать в своем приложении. Установите значение вtrueдля включения сервиса.emulatorPort/emulatorHost: Позволяют подключаться к локальным эмуляторам Firebase для разработки. Укажите порт и хост для каждого эмулируемого сервиса (например,emulatorPort: { auth: 9099, firestore: 8080 }).onFirebaseHosting: Булево значение, указывающее, развернуто ли ваше приложение на Firebase Hosting. Может использоваться для оптимизаций.useAuthEmulator/useFirestoreEmulator/ ...: Отдельные булевы флаги для принудительного использования эмуляторов для конкретных сервисов.
Использование Firebase Services
После настройки модуля вы можете получить доступ к Firebase SDK и его сервисам через инжектированный объект $firebaseApp и $firebaseAuth, $firestore, $database, $storage, $functions, $messaging, $analytics, $performance, $remoteConfig.
Пример использования Firebase Authentication:
<template>
<div>
<p v-if="user">Logged in as: {{ user.email }}</p>
<p v-else>Not logged in.</p>
<button @click="signInWithGoogle">Sign In with Google</button>
<button @click="signOut">Sign Out</button>
</div>
</template>
<script setup>
import { useFirebaseApp } from '#imports';
import { getAuth, signInWithPopup, GoogleAuthProvider, signOut as firebaseSignOut, onAuthStateChanged } from 'firebase/auth';
import { ref, onMounted } from 'vue';
const firebaseApp = useFirebaseApp();
const auth = getAuth(firebaseApp);
const provider = new GoogleAuthProvider();
const user = ref(null);
onMounted(() => {
onAuthStateChanged(auth, (currentUser) => {
user.value = currentUser;
});
});
async function signInWithGoogle() {
try {
await signInWithPopup(auth, provider);
} catch (error) {
console.error('Error signing in with Google', error);
}
}
async function signOut() {
try {
await firebaseSignOut(auth);
} catch (error) {
console.error('Error signing out', error);
}
}
</script>Пример использования Cloud Firestore:
<template>
<div>
<h1>Users</h1>
<ul>
<li v-for="user in users" :key="user.id">{{ user.name }}</li>
</ul>
</div>
</template>
<script setup>
import { useFirebaseApp } from '#imports';
import { getFirestore, collection, getDocs } from 'firebase/firestore';
import { ref, onMounted } from 'vue';
const firebaseApp = useFirebaseApp();
const db = getFirestore(firebaseApp);
const users = ref([]);
onMounted(async () => {
const querySnapshot = await getDocs(collection(db, 'users'));
querySnapshot.forEach((doc) => {
users.value.push({ id: doc.id, ...doc.data() });
});
});
</script>Аналогичным образом вы можете использовать другие сервисы Firebase, импортируя необходимые функции из соответствующих пакетов Firebase SDK (firebase/firestore, firebase/database, firebase/storage, firebase/functions, etc.) и получая доступ к инстанциям сервисов через $firebaseApp.
Плагины
Модуль @nuxtjs/firebase автоматически регистрирует плагин, который инициализирует Firebase и предоставляет инжектированные объекты. Вы можете расширять этот плагин или создавать свои собственные плагины для дальнейшей интеграции с Firebase.
Server-Side Rendering (SSR)
При использовании SSR с Firebase необходимо учитывать, что некоторые Firebase SDK могут вести себя по-разному на сервере и на клиенте (например, из-за отсутствия доступа к API браузера на сервере). Модуль @nuxtjs/firebase старается обеспечить корректную инициализацию Firebase как на сервере, так и на клиенте.
Для работы с Firebase на сервере (например, в Nuxt API-маршрутах или middleware), вы также можете использовать $firebaseApp и его сервисы.
Безопасность
При работе с Firebase ключи API являются общедоступными. Правила безопасности Firebase (например, Security Rules для Firestore и Realtime Database) являются критически важными для защиты ваших данных. Настройте эти правила в консоли Firebase.
Для серверных операций, требующих административных привилегий, используйте Firebase Admin SDK на вашем собственном бэкенде (не в Nuxt frontend).
Эмуляторы Firebase
Для локальной разработки рекомендуется использовать Firebase Emulators. Модуль @nuxtjs/firebase предоставляет опции (emulatorPort, emulatorHost, use*Emulator) для подключения к запущенным эмуляторам, что позволяет разрабатывать и тестировать ваше приложение без взаимодействия с production или staging базами данных Firebase.
Заключение
Модуль @nuxtjs/firebase значительно упрощает интеграцию Firebase в ваши Nuxt 3 приложения, предоставляя удобный доступ к Firebase SDK и его сервисам. Следуя инструкциям по настройке и используя инжектированные объекты, вы можете быстро начать использовать возможности Firebase для аутентификации, хранения данных, облачных функций и многого другого в своем Nuxt проекте. Не забывайте о правилах безопасности Firebase для защиты ваших данных.