Mejora el SEO de tu aplicación Angular

En este tutorial vamos a hablar de cómo mejorar el SEO de cualquier aplicación de Angular 4 haciendo server rendering con Angular Universal.

Índice de contenidos

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Slimbook Pro 13.3″ (Intel Core i7, 32GB RAM)
  • Sistema Operativo: LUbuntu 16.04
  • Visual Studio Code 1.16.1
  • @angular/cli 1.4.2
  • @angular 4.4.1

2. Introducción

Una de las cosas que tenemos que tener muy en cuenta cuando desarrollamos una aplicación single page con la tecnología que sea es que no es muy “seo friendly”, dado que requiere de una carga inicial de la aplicación (el típico loading…) que hace que las arañas no puedan ver el contenido de la aplicación y no puedan indexar correctamente la página.

Para resolver este problema muchas tecnologías optan por el “server rendering” o renderizado de páginas en el servidor, lo que quiere decir que al cliente que solicita la información se le sirve HTML estático. Hasta ahora en Angular no era algo trivial, y digo hasta ahora porque se ha creado el siguiente repositorio de angular-cli con la solución, tanto de server rendering como prerendering pudiendo hacer uso del lazy loading de módulos:

https://github.com/angular/universal-starter/tree/master/cli

Así que si estás a punto de empezar un proyecto con requerimiento de SEO te aconsejo que te bases directamente en este repositorio y si lo que quieres es adaptar un proyecto ya existente, sigue leyendo que a continuación te explico los pasos a seguir partiendo del repositorio anterior.

3. Vamos al lío

Así que ya tienes una aplicación con Angular en producción y alguien de negocio se ha acordado ahora del SEO porque pensaba que esto de Angular ya lo traía por defecto… bueno no te preocupes y sigue estos pasos.

1. Vamos a instalar las dependencias necesarias:

Las tres primeras son necesarias para la implementación del servidor que va a renderizar las páginas, y la última la vamos a utilizar en la fase de build.

1. Creamos el fichero server.js en la raíz del proyecto con este contenido:

Es el fichero que va a levantar nuestro servidor de NodeJS en el puerto que especifiquemos en la constante “port”. A destacar el uso LAZY_MODULE_MAP para soportar la carga lazy de módulos secundarios.

2. Creamos el fichero src/app/app.server.module.ts con el siguiente contenido:

En este fichero estamos importando el módulo principal de nuestra aplicación (AppModule), el módulo para nuestro servidor (ServerModule) y el módulo que permite el “lazy loading” (ModuleMapLoaderModule). Además establecemos en la propiedad bootstrap cuál es nuestro componente principal (AppComponent)

3. Creamos el fichero src/tsconfig.server.json con el siguiente contenido:

Fíjate como en las opciones de compilación de Angular le especificamos la ruta del módulo creado en el paso anterior.

4. Creamos el fichero main.server.ts con el siguiente contenido:

Aquí indicamos el export a la clase AppServerModule que creamos anteriormente.

5. Editamos el fichero app.module.ts para hacerlo compatible con Universal añadiendo la función .withServerTransition() y especificando un ID de aplicación, que puede ser el que se nos ocurra. En la práctica es dejar el fichero tal cual lo tengas y añadir al módulo BrowserModule lo siguiente:

6. Añadimos una nueva app llamada “server” en .angular-cli añadiendo lo siguiente a la propiedad “apps”

Este paso es muy importante y nos permite tener los dos tipos de aplicaciones en un mismo proyecto, el “normal” para desarrollar del modo común y el “server” para que nuestra aplicación se pueda servir desde el servidor en vez de renderizarse en cliente.

Especificamos un nuevo directorio de salida y le indicamos que haga uso de los ficheros que hemos ido creando: main.server.ts y tsconfig.server.json

7. Añadimos nuevos script al fichero package.json

8. Probamos el resultado

Hechas estas configuraciones es momento de arrancar nuestra aplicación para comprobar el resultado. Para ello ejecutamos:

Terminado el proceso nos dirá que la aplicación está corriendo el puerto 8000 o el que hayamos especificado en la constante port del fichero server.js

Nos conectamos a esta URL y el efecto más inmediato de que todo ha ido bien es que no vemos el típico “Loading…” (o el contenido que tengamos entre las etiquetas del selector principal en el index.html) cuando la aplicación carga, ni tan siquiera cuando forzamos un refresco de pantalla. Además si cargamos módulos secundarios con “lazy loading” tenemos que ver que solo se descargan cuando se solicitan.

4. Conclusiones

Como ves, uno de los puntos menos fuertes de las SPAs, el equipo de Angular lo ha solucionado de una forma elegante y casi transparente al desarrollador. Seguro que en futuras versiones de angular-cli pondrán el típico flag para ejecutar todos estos pasos de configuración de forma automática.

Así que ahora cuando te planteen el tema del SEO con una aplicación de Angular ya no te tienes que echar a temblar y ya puedes decir, “por supuesto el framework lo soporta” 🙂

Recordad que esta técnica y otras muchas más las encontraréis en la guía práctica de Angular y también ofrecemos cursos in-house y online.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.