jueves, 7 de julio de 2022

CÓMO USAR EL SDK 9 DE FIREBASE CON VUE - DIFERENCIAS ENTRE LOS SDK 8 Y 9 DE FIREBASE


Figura 1. Portada del post 

Migrando de la versión 8 a la 9 de Firebase.

Firebase es una plataforma para el desarrollo de aplicaciones web y aplicaciones móviles lanzada en 2011 y adquirida por Google en 2014

Es una plataforma ubicada en la nube, integrada con Google Cloud Platform, que usa un conjunto de herramientas para la creación y sincronización de proyectos que serán dotados de alta calidad, haciendo posible el crecimiento del número de usuarios y dando resultado también a la obtención de una mayor monetización.

Cuando creamos un nuevo proyecto con algún Framework de JavaScript como Vue.js, React, etc y queremos usar los servicios de Firebase como Backend, a día de hoy disponemos de dos SDK (Software Development Kit) o Kit de Desarrollo de Software, estos son la versión 8 y la 9.

La versión 8 fue lanzada el 26 de Octubre de 2020, las sucesivas mejoras se fueron implementando y en aproximadamente un año de lanzó la versión 9 el 25 de agosto de 2021.

La versión 9 introdujo una nueva API modular, que permite la modificación del árbol y la reducción del tamaño del paquete entre otras ventajas. En pocas palabras la principal ventaja es que en la versión 9 se han “modularizado” los servicios, de forma que no necesitas descargar todo el paquete si, por ejemplo solo vas a usar la autentificación y la base de datos de datos en tiempo real Firestore, pues simplemente descargas los módulos de esos dos servicios obviando el resto de paquetes, así se consigue un mejor Bounce de la aplicación.

A fecha de esta entrada del blog, se siguen utilizando ambas versiones del SDK, pero los usuarios de la versión 8 tendrán que actualizar su código si quieren que siga funcionando con la versión 9 y superiores.

Google ha proporcionado un paquete “compat” para facilitar  la migración, que veremos en esta entrada del blog y también veremos cómo empezar de cero con la versión 9.

Motivo de esta pequeña guía

Si ya tienes experiencia trabajando con distintas versiones de Firebase y diferentes Frameworks, probablemente ya sepas cómo migrar de tecnología, refactorizar tu código para adaptarlo a los cambios y mejoras, leer y entender en la documentación estos cambios, etc. El problema suele surgir cuando estás aprendiendo una nueva tecnología y aunque ya sepas programar eres un poco noobie.

Imaginemos que estás aprendiendo Vuejs y quieres construir tu primera App usando Firebase, como backend. Lo más probable es que busques algún buen curso o tutorial, en alguna plataforma como Udemy o incluso en YouTube, y es aquí cuando la cosa se empieza a enredar. Puede ocurrir y de hecho ocurre, que el curso o turorial, no tenga ni un un año, pero el creador del curso estuviera trabajando con el SDK 8 de Firebase, miestras que tú, tal vez sin ni siquiera saberlo hayas instalado la versión 9, o viceversa y es aquí cuando, si eres nuevo las cosas se empiezan a complicar ya que aunque tu código puede estar bien escrito, no funciona y no entiendes muy bien por qué. Tú estás centrado en aprender tu nuevo Framework y has configurado el Servicio de Firebase como  te han indicado en tu curso pero no va¡ y es algo muy frustrante.

Por otro lado, en mi opinión, enfrentar este tipo de problemas es muy bueno para tu aprendizaje, ya que si en vez de frustrarte, investigas qué demonios está ocurriendo, es cuando de verdad empiezas a aprender, a tomar conciencia de cómo son las cosas y lo más importante a resolver los problemas por ti mismo leyendo documentación e investigando a fondo la tecnología que estás aprendiendo. Y que nadie te engañe, en este mundo de la tecnología todos hemos sido nuevos, todos hemos copiado y pegagado código de Stack Overflow y todos nos hemos sentido frustrados al no entender por qué no compilaba un código después de revisarlo un millón de veces hasta las 4 de la madrugada.

Vue js

Los ejemplos ficticios que voy a mostrar son de Vuejs, aunque salvo pequeñas diferencias son válidos para el framework en el que trabajes, REACT, ANGULAR… Claro está deberás investigar cuales son los matices de tu framework a la hora de trabajar con Firebase.

No voy a tratar el tema de cómo empezar de cero con Firebase 8, porque no tiene sentido, si vas a empeza una nueva App de cero que trabaje con Firebase, debes empezar directamente con la última versión estable, en nuestro caso y a día de hoy Firebase 9.  Lo que si haré es tratar el asuto cómo haer compatible un código basado en el SDK 8 para que pueda funcionar con el SDK 9, e intentaré tratar los casos de la forma más ordenda posible, recuerda estoy trabajando con Vue js 3.

 

CREANDO UN PROYECTO VUE 3 FIREBASE 9

Creando el proyecto en la consola

En una entrada anterior vimos cómo crear un proyecto Vue js con CLI, imaginemos que ya tenemos nuestro proyecto creado y hemos implementado una navegación con todo lo necesario para poder registrarnos, logearnos y deslogearnos y ya estamos en el punto de necesitar el servicio de autentificación de firebase.

Bién pues lo primero que tenemos que hacer es crear un nuevo proyecto en la plataforma para posteriormente registrar nuestra pequeña App


Figura 2. Creando un nuevo proyecto en la consola de Firebase


Le damos un nombre a nuestro proyecto, en este caso ficcticio es Pets


Figura 3. Dando nombre al proyecto 


Para el ejemplo no vamos a necesitar Google Analithics, así que no lo activaríamos, en cualquier caso esto es algo que podemos hacer posteriormente si lo necesitamos:

Figura 4. Habilitar i no Analytics


Se crea el proyecto, se nos indica que agregemos Firebase a nuestra App, le indicaremos la tecnología que vamos a usar en este caso web:


Figura 4. Tecnología web


Le daremos el sobrenombre a la app, en este caso la llamo igual, pets. No voy a poner en producción esta app de momento  así no configuro el hosting. Ya solo queda registrar la aplicación.

Elección del SDK (La versión de Firebase)

Si leemos bien la pantalla que se nos muestra para agregar Firebase a nuestra app, veremos que si usamos npm (o yarn) se nos instalará la versión más reciente de Firebase el sdk v9:


 

Figura 5. Configuración del proyecto 

 

Entonces, siguiendo las indicaciones iremos a la consola de nuestro VSCode o la que usemos e Instalaremos  firebase SDK 9  en la  app , Para ello nos situaremos con la consola en la raíz del proyecto y lanzaremos el comando:

 npm i firebase

En la carpeta raíz del proyecto creo un nuevo archivo que llamaré firebase.js


Figura 6. Archivo firebase.js en la raíz del proyecto 


Este nuevo archivo que hemos creado Firebase.js, es el archivo de configuración de Firebase en nuestra App, en el pegaremos  la configuración que se nos ha mostrado en la web de Firebase cuando hemos creado el proyecto:

// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
 
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries

// Your web app's Firebase configuration

const firebaseConfig = {
  apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  authDomain: "tu-app.firebaseapp.com",
  projectId: "xxxxxxxx",
  storageBucket: "xxxxxx.xxxxxxx.com",
  messagingSenderId: "xxxxxxxx",
  appId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
};
 
// Initialize Firebase
const app = initializeApp(firebaseConfig);

 

Resaltado en violeta, podemos ver cómo por defecto, se nos muestra un mensaje indicándonos que podemos empezar a añadir los módulos del SDK que necesitemos usar y nos da una URL a la documentación donde podremos ver ejemplos de uso.

Volviendo a nuestro caso, quedamos en que íbamos a necesitar el servicio de autentificación de Firebase, así que en nuestro archivo de configuración importaremos el módulo correspondiente “getAuth”, además vamosa importar dos módulos más, getFirestore y getStorage, que son los correspondientes a la base de datos en tiempo real y al almacenamiento, respectivamente. Si por ejemplo de momento no vamos a usar Storge “getStorage” lo podemos dejar comentado de forma que no aumente el peso de la app, hasta que lo neesitemos, puedes ver ls importaciones de estos módulos remarcados en Violeta:

Luego tendríamos la configuración en sí, de nuestro proyecto Firebase, que se nos ha dado al crear el proyecto en la web (en naranja).

Por último, guardaríamos en constantes los módulos que heoms importado de Firebase, para poder exportarlos, de modo que estén disponibles desde cualquier punto de la APP (en verde)

// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
 

//Importo más funciones del SDK 9
import { getAuth } from "firebase/auth";
import { getFirestore } from "firebase/firestore";
//import { getStorage } from "firebase/storage";
 

// Your web app's Firebase configuration
const firebaseConfig = {
  apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  authDomain: "tu-app.firebaseapp.com",
  projectId: "xxxxxxxx",
  storageBucket: "xxxxxx.xxxxxxx.com",
  messagingSenderId: "xxxxxxxx",
  appId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
};

 
// Initialize Firebase
const app = initializeApp(firebaseConfig);
 
//Exporto las funciones importadas de firebase para que estén disponibles en la app
const auth = getAuth(app)
export { auth }             //Auth de firebase ahora es simplemente auth (la const que exporto)
 
const db = getFirestore(app)  
export { db }                           //Ahora firestore es simplement db

 

Una vez tengo configurado mi servicio de Firebase, y exportados los módulos que quiero usar. Puedo hacer uso de las funciones de que cada uno de estos módulos dispone.

Este es un concepto muy importante que se debe entender y que supone la principal diferencia entre la versión 8 y la 9 del SDK de firebase.

Por ejemplo hablando de autentificación, con la versión 8 al haber exportado el módulo getAuth en la constante auth, teníamos todos los métodos de este módulo disponibles solo con llamar a esa constate auth desde cualquier archivo de la App, sin embargo con la versión 9, además de llamar a esa constate auth, deberemos invocar los métodos contenidos en ese módulo que quramos utilizar, veamos un eejemplo:

Imaginemos que quiero usar los métodos SignInWithEmailAndPassword, createUserWithEmailAndPassword y signOut, que són tres métodosque me permiten hacer login con user y pasword, crear un nuevo usuario y hacer logout respectiamente. Antes con el SDK 8 PODÍA INVOCARLOS DIRECTMENTE DESDE CUALQUIER ARCHIVO, Ahora con el SDK 9 no, para poder usarlos deberé importar en el archivo no solo la constante auth (que gardaba el módulo getAuth) sino los métodos porpios de getAuth que quiero usar:

·        Módulo getAuth (en verde)

·        Métodos de getAuth (en naranja)

//Importando auth y los métodos de auth que voy a necesitar SDK9:
import { auth } from "../firebase.js"
import { SignInWithEmailAndPassword,
         createUserWithEmailAndPassword,
         signOut } from 'firebase/auth'
         

 

Por supuesto en la zona donde se deba hacer la importción en función del framework que uses, en el caso de Vue se hace en el apartado script al principio del todo (en azul)

<template>
  //Código…
</template>
 
<script>
//Importando auth y los métodos de auth que voy a necesitar SDK9:
import { auth } from "../firebase.js"
import { SignInWithEmailAndPassword,
         createUserWithEmailAndPassword,
         signOut } from 'firebase/auth'
 
export default {
  name: "nombre_de_la_vista",
 
  setup() {},
 
</script>
 
<style>
 //Código…
</style>

 

COMO USAR LOS MÉTODOS DE CADA MÓDULO

Supongamos que ya tenemos importados los métodos necesarios para crear una acción asíncrona, en Vuex que acometa una mutación del estado para crear un nuevo usuario, imaginemos que es una acción que recibe como payload, desde una vista, el nombre el password y el email de un usuario nuevo:

   async doRegister({ commit },{ name, email, password}) {
      await createUserWithEmailAndPassword(auth, email, password) //Creamos el usuario
      await updateProfile(auth.currentUser, {
          displayName: name    //Añadimos el nombre a la propiedad displayName del usuario en firestore
      })
      commit("setUser", auth.currentUser)
   },
 

Como se puede ver remarcado en naranja, estamos usando el método createUsrWithEmailAndPassword, al que, además del payload hay que pasarle el módulo auth, para que ese método pueda funcionar y hacer su trabajo.

Por supuesto los métodos de cada módulo y su sintaxis están explicados en la documentación, pero deberás buscar en la documentación del SDK con el que est´s trabajando 8 o 9.

HACIENDO COMPATIBLE UNA APP VUE  3 CREDA BAJO EL SDK 8 CON EL SDK 9

Si tu caso es que la App ya funciona con el código basado en el SDK 8 PERO NECESITAS HACERL COMPATIBLE CON EL SDK 9 y no refactorizar todo el código, tienes la opción de configurar Firebase del siguiente modo:

Archivo Firebase.js

Donde la clave es añadir la palabara compat a las importaciones (en violeta)

import firebase from "firebase/compat/app";
import "firebase/compat/auth";
import "firebase/compat/firestore";
import "firebase/compat/storage";
 
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
 
// Your web app's Firebase configuration
const firebaseConfig = {
  apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  authDomain: "xxxxxxxxxxxxxxxxxxxxxxxxx",
  projectId: "xxxxxxxxxxxxxxxxxxxxxxx",
  storageBucket: "xxxxxxxxxxxxxxxxxxxxxx",
  messagingSenderId: "xxxxxxxxxxxxxxxxxx",
  appId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
};
 
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
 
export const db = firebase.firestore();
export const auth = firebase.auth();
export const storage = firebase.storage();

  




No hay comentarios:

Publicar un comentario