16/03/2020

SEO en una aplicación Ionic/Angular gracias a Angular Universal

Digital55
SEO en una aplicación Ionic - Angular

Día a día, el uso de aplicaciones JavaScript en internet sigue creciendo. En la mayoría de los casos, los equipos de desarrollo usamos alguno de los frameworks actuales para el desarrollo de estas. Uno de los más usados es Angular. Además, siguiendo las tendencias actuales, es muy posible que los nuevos desarrollos que se aborden estén destinados a ser aplicaciones progresivas que corran en cualquier dispositivo. Estas aplicaciones son conocidas como PWA (Progressive Web Apps). Una de las herramientas más conocidas para construir este tipo de aplicaciones es Ionic.

Por lo general, estas aplicaciones son Client Side Rendered. Esto quiere decir que el navegador del cliente es el encargado de renderizar la web y esto hace que estas webs no tengan un SEO óptimo al no poder ser indexado por los navegadores.

Angular Universal es una librería para que nos permite configurar nuestra aplicación para que sea renderizada en el servidor y de esta forma servir código HTML al cliente que pueda ser indexado.

Las principales ventajas que nos aporta está técnica son la siguientes:

  • Mejor SEO de la aplicación
  • Cargas más rápidas
  • Previews de los links de nuestra aplicación en RRSS

Angular Universal con Ionic

Recientemente hemos recibido una buena noticia y es que el equipo de Ionic ha comenzado a dar soporte a Angular Universal en la última versión de su framework:

Digital55 Ionic Framework

Demo Blog App

Para comprobar el funcionamiento de esta técnica vamos a construir un sencillo blog usando Ionic y Angular que se renderice desde el servidor y sirva el contenido directamente al cliente.

Para ello en primer lugar instalamos Ionic:

npm install -g @ionic/cli

Creamos la aplicación Ionic indicando que vamos a usar Angular como framework:

ionic start ssrApp blank --type angular cd ssrApp/

A continuación, vamos a añadir Express. Se trata de un framework para Node y es utilizado por Angular Universal para realizar las tareas de renderizado en el servidor.

ng add @nguniversal/express-engine

Por último, instalamos el módulo de Ionic para Angular Universal. Este módulo aún está en versión de desarrollo pero próximamente será incluido en las nuevas versiones de Ionic.

npm install @ionic/angular-server@dev

Tras añadir este módulo, tenemos todo listo para poder generar nuestra aplicación en el servidor. Vamos a ver primero como funciona.

¿Cómo funciona?

Antes de darle un poco de funcionalidad a nuestra aplicación vamos a ver como funciona Angular Universal. En nuestro archivo angular.json vemos que se ha creado una nueva configuración de build:

Código Angular Json

En este archivo, se generará una nueva aplicación en el directorio dist que habrá sido previamente renderizada en el servidor.

Los archivos main.server.ts y app.server.module.ts son los encargados de lanzar nuestra aplicación cuando esta ha sido cargada en el servidor:

Código Angular Module

Cómo vemos en la imagen, hemos incluido la importación del módulo IonicServerModule.

Añadiendo funcionalidad al blog

Vamos a añadir un poco de funcionalidad a nuestro blog para obtener este resultado final:

Digital55 ssr app

En primer lugar vamos a generar un servicio encargado de devolvernos los posts de nuestro blog:

ionic g s home/posts

Así quedaría el código del servicios posts.service.ts:

Código Angular Service

Simplemente lo que hacemos es devolver un objeto con los datos de los posts, en una aplicación real estos datos serían devueltos por un backend.

A continuación en el archivo home.page.ts vamos a implementar la llamada al servicio:

Código Angular Component

Y por último vamos a incluir los componentes encargados de mostrar los posts en la vista home.page.html:

Digital55 View

Probando nuestra aplicación

Con esto nuestro blog, a falta de alguna funcionalidad, ya sería operativo. Estamos listos para comprobar si el renderizado en servidor funciona correctamente. Para ello solo tenemos que ejecutar el siguiente comando:

npm run dev:ssr

Tras la compilación podremos irnos a http://localhost:4200/ y comprobar que se está sirviendo correctamente.

¿Cómo sé que el renderizado en servidor funciona?

Hay dos formas de comprobar que efectivamente nuestra aplicación se está renderizando en el servidor y se está sirviendo correctamente.

1.- Desactivar JavaScript en nuestro navegador:

En teoría, nuestro navegador recibirá del servidor solamente código HTML y CSS por lo tanto, al desactivar JavaScript la aplicación debe funcionar perfectamente.

Para desactivar JavaScript, por ejemplo en Chrome, puede realizarse desde este enlace.

Tras hacerlo, podemos comprobar que la aplicación carga correctamente:

 

2.- Viendo el código fuente de la aplicación:

Otra forma de comprobar que nuestra aplicación está renderizando correctamente en el servidor es directamente observando el código fuente que ha cargado nuestro navegador. En una aplicación angular que renderice en el cliente veríamos algo parecido a esto:

Básicamente, solo vemos la etiqueta app-root que es la que modifica el DOM cargando el contenido renderizado por el cliente cuando lo necesite. Sin embargo, si vemos el código fuente de nuestra aplicación:

Digital55 source code ssr

Vemos que dentro de la etiqueta tenemos todo el contenido HTML de nuestra aplicación.

Conclusión

El fin con el que se construyen aplicaciones JavaScript cada día es más amplio y hace que varíen las necesidades que estas deben cubrir. En muchas ocasiones es muy importante que una aplicación tenga un buen SEO para que pueda ser indexada por los navegadores o para que pueda ser enlazada y compartida correctamente en las redes sociales.

Gracias a tecnologías como Angular Universal o Ionic se puede conseguir este objetivo de forma sencilla.

El código de la aplicación de ejemplo que hemos desarrollado está en el siguiente repositorio.

Digital55

Comparte el post:

¿Hablamos?

Si necesitas desarrollar o mejorar tu negocio digital, cuenta con nosotros. Puedes escribirnos un mail a hello@digital55.com, llamarnos al teléfono 913 091 641 o rellenar el formulario que encontrarás más abajo.