Guía 10: Firebase: Realtime Database y SDK#
Actividades previas#
Firebase: Proyecto#
Acceda a Firebase con su cuenta personal de Google.
En Firebase Console, cree el proyecto landing. No es necesario configurar Google Analytics para este proyecto.
Utilice un cliente de IAG para explicar los servicios, y sus casos prácticos de uso, que ofrece Firebase.
Ambiente de desarrollo#
Acceda a su proyecto landing en Codespaces o en su máquina local.
Cree y utilice la(s) rama(s) de desarrollo.
Instale los paquetes y levante el servidor, con:
npm install npm run dev
Actividades en clases#
HTML#
En el documento index.html, agregue una sección registrar el voto por un producto y mostrar el resultado de la votación.
Ver el código
<section class="bg-slate-50 dark:bg-gray-900"> ... </section> <section class="flex flex-col items-center justify-center bg-white py-8"> <div class="bg-white p-8 rounded-lg shadow-md w-full max-w-md"> <h2 class="text-2xl font-bold mb-6 text-center text-gray-800">Vota por tu producto preferido</h2> <div class="mb-6"> <form id="form_voting" class="relative flex items-center"> <select id="select_product" class="block appearance-none w-full bg-white border border-gray-300 text-gray-700 py-3 px-4 pr-8 rounded-lg leading-tight focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"> <option value="" disabled selected>Seleccione un producto</option> <option value="product1">Producto 1</option> <option value="product2">Producto 2</option> <option value="product3">Producto 3</option> </select> <button class="ml-4 bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-6 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50"> VOTAR </button> </form> </div> <div id="results" class="border border-gray-300 rounded-lg h-52 w-full p-2 bg-gray-50"> <p class="text-gray-500 text-center mt-16">Resultado de la votación</p> </div> </div> </section> <div id="toast-interactive" ... > </div>
Firebase: App - web#
En su proyecto de Firebase:
Junto a Project Overview, despliegue el menú de configuración del proyecto y escoja Project settings.
En la pestaña General, desplácese hasta la sección Your apps.
Haga clic en el ícono de elemento HTML para crear una web app.
En la ventana modal Add Firebase to your web app
Ingrese un nombre para su aplicación web y haga clic en Register app.
En Add Firebase SDK, seleccione la opción Use a <script> tag y copie la configuración para establecer la conexión con Firebase.
const firebaseConfig = { apiKey: "API_KEY", authDomain: "PROJECT_ID.firebaseapp.com", projectId: "PROJECT_ID", storageBucket: "PROJECT_ID.firebasestorage.app", messagingSenderId: "SENDER_ID", appId: "APP_ID", };
Con un cliente de IAG, explique cómo se utiliza el objeto de configuración de Firebase en la inicialización de la aplicación web y en la conexión con los servicios con Vanilla Javascript.
Realtime Database#
Dentro de su proyecto en Firebase, acceda a la categoría de productos Build, en la opción Realtime Database.
Cree una base de datos en tiempo real seleccionando Create Database.
Seleccione la ubicación de la base de datos, preferiblemente la más cercana a su usuario final.
En Security rules, elija Start in Test Mode para permitir el acceso sin restricciones durante el desarrollo inicial.
Atención
Nota de seguridad: El modo de prueba permite que cualquier persona pueda leer y escribir en la base de datos sin autenticación. Esto es útil para pruebas, pero asegúrese de cambiar a un modo más seguro antes de desplegar su aplicación en producción.
Utilice una cliente de IAG para explicar cómo se estructura la base de datos en tiempo real de Firebase.
.env#
En la raíz de su proyecto, cree un archivo llamado .env.
En este archivo, agregue las siguiente variables de entorno y pegue los valores correspondientes de la configuración de Firebase que copió anteriormente:
VITE_FIREBASE_API_KEY="API_KEY" VITE_FIREBASE_AUTH_DOMAIN="PROJECT_ID.firebaseapp.com" VITE_FIREBASE_PROJECT_ID="PROJECT_ID" VITE_FIREBASE_STORAGE_BUCKET="PROJECT_ID.firebasestorage.app" VITE_FIREBASE_MESSAGING_SENDER_ID="SENDER_ID" VITE_FIREBASE_APP_ID="APP_ID"
Asegúrese de que el archivo .env esté incluido en su archivo .gitignore para evitar subirlo al repositorio.
... # Firebase environment variables .env
Atención
Al versionar, omita el archivo .env en el versionamiento local y remoto, para evitar exponer las credenciales de Firebase.
Con un cliente de IAG, explique la importancia de las variables de entorno para mantener la seguridad de las credenciales de Firebase y cómo se utilizan en el código en Vite.
JS: Conexión a Firebase#
Cree el documento javascript js/firebase.js, agregue el siguiente código:
Desde el CDN, importe la última versión(firebase@x.y.z) de las funciones de Firebase para inicializar la aplicación (initializeApp), acceder a la base de datos en tiempo real (getDatabase, ref), crear datos (set, push) y obtener datos (get y child) .
import { initializeApp } from "https://www.gstatic.com/firebasejs/x.y.z/firebase-app.js"; import { getDatabase, ref, set, push, get, child } from "https://www.gstatic.com/firebasejs/x.y.z/firebase-database.js";
Utilice las variables de entorno definidas en el archivo .env para configurar la conexión a Firebase, considerando que utiliza Vite como herramienta de construcción.
... const firebaseConfig = { apiKey: import.meta.env.VITE_FIREBASE_API_KEY, ..., appId: import.meta.env.VITE_FIREBASE_APP_ID, };
Inicialice la aplicación Firebase utilizando el objeto de configuración importado desde las variables de entorno.
const firebaseConfig = { ... }; const app = initializeApp(firebaseConfig);
Obtenga una referencia a la base de datos en tiempo real de Firebase asociada con la aplicación.
const app = ...; const database = getDatabase(app);
Aún no exporte las funciones.
Con un cliente de IAG, explique cómo se utiliza el SDK de Firebase para enviar datos a la base de datos en tiempo real.
JS: Guardar votos en Firebase#
En el documento javascript js/firebase.js, implemente el siguiente código:
Define una función flecha saveVote, que reciba un parámetro productID.
Dentro de la función, tome como referencia la documentación de Operaciones básicas de escritura:
Obtenga una referencia a la colección votes de la base de datos, con la función ref().
Crea una nueva referencia para un usuario utilizando la función push().
Guarda los datos (productID y la fecha actual) en la base de datos con la función set().
Maneje el resultado de la función set() como una promesa, devuelva un objeto con un estado y un mesaje de éxito o de error.
Exporta la función saveVote para que pueda ser utilizada en otros archivos.
Con un cliente de IAG, explique cómo se utiliza el SDK de Firebase para realizar las operaciones CRUD (Create, Read, Update, Delete).
JS: Enviar datos desde un formulario#
En el documento js/file01.js.
Importe la función saveVote desde js/firebase.js.
Implemente la siguiente funcionalidad:
Defina la función flecha enableForm (antes de la función de autoejecución).
Dentro de la función flecha, obtenga una referencia al formulario HTML con el identificador 'form_voting'.
Con la referencia al formulario, utilice addEventListener para el evento 'submit' y un listener que:
Use el evento del callback para prevenir el comportamiento por defecto del formulario. Use el método preventDefault.
Obtenga la referencia al elemento con identificador 'select_product' y extraiga el valor mediante el atributo value.
Llame a la función saveVote con el valor obtenido del campo de texto. Maneje la promesa y muestre el resultado con un mensaje de alerta.
Invoque la función enableForm en la función de autoejecución.
En el navegador, verifique que al enviar el formulario se guarden los votos en Firebase y que se muestre un mensaje de éxito o error.
Con un cliente de IAG, explique cómo se maneja la interacción entre el JavaScript y la interfaz de usuario, y cómo se envían los datos a Firebase.
JS: Obtener votos en Firebase#
Modifique el código del archivo js/firebase.js, de acuerdo con las siguientes especificaciones:
Defina getVotes y asigne una función flecha asíncrona.
Dentro de la función, tome como referencia la documentación de Lee los datos una sola vez:
Obtenga una referencia a la colección votes de la base de datos, con la función ref().
Utilice la función get para esperar por los datos de la colección.
Si existen datos, retorne un objeto con el estado y los datos obtenidos, con la función val(). De lo contrario, retorne un objeto con un estado y un mensaje indicando que no hay datos.
Exporte la función getVotes para que pueda ser utilizada en otros archivos.
Con un cliente de IAG, explique cómo se utiliza el SDK de Firebase para obtener datos de la base de datos.
JS: Mostrar datos en una tabla#
En el documento js/file01.js.
Importe la función getVotes desde js/firebase.js.
Implemente la siguiente funcionalidad:
Defina displayVotes y asigne una función flecha asíncrona.
Dentro de la función, use la función getVotes y espere por los votos.
Itere sobre los votos obtenidos y cree una tabla donde cada fila represente un voto. En cada fila, muestre el producto votado y el total de votos.
Inserte la tabla en el elemento HTML con el identificador results.
Invoque la función displayVotes en la función de autoejecución.
En el navegador, verifique que al cargar la página se muestren los votos almacenados en Firebase en una tabla.
Versionamiento#
Versione local y remotamente la(s) rama(s) de desarrollo en el repositorio landing.
Genere la(s) solicitud(es) de cambios (pull request) para la rama principal y apruebe los cambios.
Vercel#
Atención
Agregue las variables de entorno con el nombre y valor que aparecen en el archivo .env.
Verifique el despliegue continuo (CD) del proyecto en Vercel.
Conclusiones#
Actividades autónomas#
Recursos extras#
En redes:
🔥 #Firebase está preparando un nuevo SDK para JavaScript que hará la librería más ligera y traerá cambios importantes que nos harán refactorizar nuestras apps si queremos aprovechas sus ventajas.
— Carlos Azaustre 💻 (@carlosazaustre) July 30, 2021
🧵 Te las cuento en el hilo 👇 pic.twitter.com/oJHLopDw1J