Contenido del curso
Gestión de Entornos
Nuevas Funcionalidades en Angular
- 7

Variables locales con @let en Angular
09:14 min - 8

Lazy loading de imágenes con ngSrc en Angular
17:08 min - 9

URLs amigables para SEO en Angular
Viendo ahora - 10

"Reactividad en Angular: Migración a Input Signals"
20:42 min - 11

Migración automática de @Input a signals en Angular
12:23 min - 12

Migración de Outputs en Angular: De Decoradores a Funciones
07:35 min - 13

linkedSignal en Angular: computed con set
12:56 min - 14

Sincronización de Componentes en Angular con Model y Signals
12:03 min - 15

toSignal: Observables de RxJS como Signals
11:17 min - 16

Conversión de Observables a Signals en Angular con toSignal
08:07 min - 17

Interoperabilidad de RXDS y Signals en Angular: Uso de RX Resourcers
11:10 min - 18

Manejo de Parámetros Reactivos con RX Resource en Angular
09:18 min - 19

Manejo de Promesas y Fetch en Angular sin RXJS
07:59 min - 20

Reactividad en Angular: Uso de Signals para Consultas DOM
09:00 min - 21

Configuración de Prettier para HTML en Angular
05:28 min
Server-Side Rendering (SSR) y Navegación
- 22

Migración al Application Builder de Angular
10:17 min - 23

Server Side Rendering con Angular: Mejora Rendimiento y SEO
13:26 min - 24

afterNextRender: código seguro solo en el browser
09:42 min - 25

Geolocalización y APIs: Creando un Mapa de Tiendas Cercanas
15:39 min - 26

Pre-rendering en Angular con ng build
11:25 min - 27

Desplegando Angular SSR en Firebase
18:12 min
Optimización de Rendimiento
- 28

Generación de Meta Tags Dinámicos con Angular y Open Graph
15:11 min - 29

Creación de MetaTags Dinámicos en Angular
12:51 min - 30

Proceso de Hydration y Event Replay en Angular
05:54 min - 31

Productos relacionados con RxResource en Angular
09:25 min - 32

Carga diferida de componentes en Angular para mejorar rendimiento
10:10 min - 33

Optimización de Incremental Hydration en Angular
06:14 min - 34

Configuración de Server Routing en Angular
10:43 min - 35

Aplicaciones Sin Zone.js: Migración a Signals en Angular
13:02 min - 36

Cierre del curso avanzado de Angular
00:53 min
URLs amigables para SEO en Angular
Resumen
Optimizar las rutas de una aplicación Angular es uno de los pasos más importantes para mejorar el posicionamiento en motores de búsqueda. Aquí aprenderás a transformar URLs basadas en IDs en slugs legibles, una práctica clave para SEO que prepara tu aplicación para aprovechar al máximo Server-Side Rendering.
Por qué Angular necesita URLs amigables para SEO
Durante mucho tiempo Angular se asoció con dashboards y aplicaciones administrativas llenas de formularios y gráficas. Hoy, gracias a mejoras como Server-Side Rendering, también es una opción sólida para sitios públicos como un e-commerce, un buscador o un formulario abierto al público.
Y ahí es donde entra el detalle de las rutas. Si navegas por Platzi sin login, vas a notar que las URLs no usan identificadores numéricos, sino palabras descriptivas: platzi.com/escuela/datos, cursos/nombre-del-curso. Eso es un slug: una cadena única que describe el contenido y le dice algo a Google sobre lo que vive en esa página [00:34].
¿Qué es un slug en una URL? Es un identificador único en formato de texto legible que reemplaza al ID numérico. Por ejemplo,
clothesen lugar de?categoryId=2. Funciona igual que un ID (debe ser único), pero comunica significado tanto al usuario como al motor de búsqueda.
Cómo transformar la ruta de categorías a slug en Angular
La ruta de categorías original no existía como tal: el componente raíz renderizaba un ListComponent y filtraba productos a través de un query param opcional llamado category_id [03:45]. Esa URL funciona, pero no es amigable.
La solución es crear una nueva ruta reutilizando el mismo componente:
- Copia el path existente y define la nueva ruta como
category/:slug. - Mantén el input del componente como opcional, porque el mismo
ListComponentse reutiliza en distintos contextos. - Cambia el nombre del parámetro de
categoryIdaslugdentro del componente.
Así, cuando alguien entra a /category/clothes, Angular lee el slug desde la ruta en lugar de un query param numérico.
Cómo ajustar el servicio getProducts para filtrar por slug
El siguiente paso ocurre en la capa de servicios. El método getProducts debe aceptar tanto categoryId como categorySlug, ambos opcionales [06:18].
- Si llega
categoryId, se envía como query param a la API. - Si llega
categorySlug, se envía también como query param con su nombre correspondiente. - Si ninguno llega, simplemente no se incluye en la petición.
Esto depende de cómo esté diseñada tu API. En el caso de la API de Platzi, el endpoint de productos acepta ambos parámetros, así que puedes filtrar por cualquiera de los dos sin romper la lógica existente.
typescript getProducts(params?: { category_id?: string; category_slug?: string }) { // construye dinámicamente los query params // según cuál venga definido }
Cómo actualizar los enlaces del listado de categorías
Falta un detalle: los enlaces del menú todavía apuntaban al formato viejo con query param. Si haces clic, no pasa nada, porque el componente ya no escucha ese parámetro [08:52].
La corrección está en la plantilla del listado:
- Cambia el
routerLinkde?categoryId=a/category/{{category.slug}}. - Asegúrate de que cada objeto categoría tenga el atributo
slug, que la API ya entrega junto alid,nameeimage.
Al probarlo, la petición sale como products?category_slug=clothes y la URL del navegador queda como /category/clothes. Limpia, descriptiva y lista para indexar.
Qué retos aplicar al detalle de producto
Las categorías ya tienen URLs amigables, pero el detalle del producto sigue navegando con el ID: /product/1. El reto es replicar la misma lógica.
¿Cómo aplicar slug a la ruta de un producto? Cambia
:idpor:slugen la configuración del router, ajusta el servicio para consultar el producto por slug en lugar de ID y usaproduct.slugen losrouterLinkdel listado.
Los pasos concretos son:
- Modificar la ruta del producto para recibir
:slug. - Revisar la documentación de la API y encontrar el método de consulta por slug.
- Reemplazar
product.idporproduct.slugen los enlaces del listado.
Recuerda que el atributo slug ya viene en cada producto que devuelve la API, igual que ocurre con las categorías.
Por qué los slugs funcionan como identificadores únicos
Un slug no es solo decoración. Cumple la misma función que un ID: identifica de forma única un recurso. No pueden existir dos cursos ni dos productos con el mismo slug, porque colisionarían en el routing [02:30].
La diferencia con un ID numérico es que el slug aporta contexto semántico. Para un buscador, cursos/angular-avanzado comunica muchísimo más que cursos/4821. Y cuando combines esto con Server-Side Rendering, los beneficios para SEO se multiplican, porque el HTML que reciben los crawlers ya viene con URLs descriptivas y contenido renderizado.
¿Cómo vas a estructurar los slugs en tu propia aplicación? Cuéntame en los comentarios qué patrón usas para mantenerlos únicos.