Cómo manejar correctamente los cambios de URL slug en Next.js

Rate this content
Bookmark

Si estás utilizando un CMS sin cabeza para almacenar contenido, también trabajas con URL slugs, las últimas partes de cualquier URL. El problema es que los editores de contenido pueden cambiar libremente los slugs, lo que puede causar errores 404, pérdida de rangos de página, enlaces rotos y, al final, visitantes confundidos en tu sitio. En esta charla, presentaré una solución para mantener un historial de URL slugs en el CMS y explicaré cómo implementar un mecanismo de redirección adecuado (¡usando TypeScript!) para páginas generadas dinámicamente en un sitio web de Next.js.

Añadir a las notas de la charla: https://github.com/ondrabus/kontent-boilerplate-next-js-ts-congress-2022 

10 min
29 Apr, 2022

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Esta charla explica cómo manejar los cambios de URL slug en Next.js utilizando los métodos getStaticPaths y getStaticProps. Cubre la implementación de redirecciones y proporciona una solución para eliminar la necesidad de que los editores realicen pasos adicionales. El enfoque implica el seguimiento de los cambios de URL slug y la emisión de redirecciones adecuadas. El orador anima a la audiencia a hacer preguntas o compartir sus experiencias con el manejo de URL slugs.

Available in English

1. Manejo de cambios en URL Slack en Next.js

Short description:

Hola a todos. Soy Andrey, evangelista de desarrolladores en Content by Kentico. Hoy, explicaré cómo manejar los cambios en URL Slack en Next.js. Cada elemento de contenido en el CMS sin cabeza contiene un URL slag, y cuando el editor lo cambia, el antiguo URL slag deja de existir, resultando en errores 404 para los visitantes. Para manejar esto correctamente, necesitamos conocer el historial de URL slag y usar los métodos getstaticpaths y getstaticprops en Next.js para emitir redirecciones. Comencemos con el lado del contenido, donde podemos usar el elemento personalizado urlslug-history para rastrear los cambios de URL slag.

Hola a todos. Soy Andrey, evangelista de desarrolladores en Content by Kentico. Y hoy, quiero contarles cómo manejar correctamente los cambios en URL Slack en Next.js.

Ahora, primero que nada, ¿por qué deberíamos preocuparnos por los URL slags? Cada elemento de contenido que se almacena en el headless CMS y que realmente estás almacenando o mostrando como una página en tu implementación de sitio contiene un URL slag. Ahora, el problema es cuando el editor entra en ese elemento de contenido, cambia el URL slag, y tu implementación de sitio simplemente toma el cambio, reconstruye la página, y la antigua página, el antiguo URL slag simplemente deja de existir. El problema es que si esa página solía tener un buen ranking de página en los motores de búsqueda, o usaste esa página en tus campañas de marketing, todos esos visitantes que están usando esa URL ahora obtendrán errores 404. Y en estos días realmente no podemos permitirnos visitantes confundidos, ¿verdad?

Entonces, lo que necesitamos hacer es, primero, necesitamos saber para cada página, cada elemento de contenido, necesitamos conocer el historial de URL slag. Ves aquí, el ejemplo es que la página actual tiene un URL slug, hello-typescript-congress, pero en el pasado solía tener un URL slug, typescript-congress y hello-conference, necesitamos conocer el historial para poder emitir las redirecciones correctamente. Lo siguiente es para Next.js, ahora vamos a estar usando Next.js y contenido en este ejemplo, pero si estás usando un framework diferente, puedes aplicar los mismos principios allí. Aquí solo estamos hablando de Next.js, por lo que tenemos dos métodos. Tenemos getstaticpaths y getstaticprops. En getstaticpaths, necesitamos proporcionar todos los URL slugs donde hay una página para nosotros para generar. En ese caso, necesitamos proporcionar los tres URL slugs. Así que, esos son los históricos y los actuales también. Y el último paso, el tercer paso es agregar una redirección adecuada en getstaticprops. Allí necesitamos averiguar en base al slug, si este es un slug actual, como el hello-typescript-congress, que es la página objetivo, o si el slug que estamos usando es uno histórico, y deberíamos redirigir al visitante a una página actual. En este caso, serían el typescript-congress, hello-conferences, que emitirán redirecciones. Entonces, ¿cómo podemos hacer esto en Next.js? Echemos un vistazo. Comencemos en el contenido primero. En el lado del contenido de las cosas, preparé un tipo de contenido llamado conferencia. Y cuando miras el elemento de contenido, ya está usando ese tipo de contenido. Ves en el contenido que tenemos un elemento personalizado especial urlslug-history que puedes usar en tu proyecto. Está disponible de código abierto, por lo que simplemente podemos implementarlo en Netlify o Vercel y usarlo tal como lo estoy usando aquí. Realmente rastrea todos los cambios que haces a un urlslug. Así que ves aquí, ahora el urlslug es typescript-congress-2022. Si lo cambio a typescript-congress, automáticamente registra el cambio. Y cuando publico la página, va a almacenar el cambio dentro del elemento de contenido. Así que ves que esto está en el historial. Ahora, podemos hacer esto tantas veces como queramos. Simplemente vamos a obtener una lista de cadenas de la API, pero este es el primer paso.

2. Implementación de cambios en URL Slug en Next.js

Short description:

En Next.js, debes proporcionar todas las rutas a getStaticPaths o como resultado a Next.js. En getStaticProps, debes emitir la redirección si es una página que debe ser redirigida. Creamos una lista de todos los slugs y todos los slugs actuales a los que deben redirigir. Almacenamos todas las rutas en la caché y proporcionamos todos los slugs, históricos y actuales, de vuelta a Next.js. Emitimos una redirección adecuada si descubrimos que deberíamos.

Necesitas conocer todos los urlslugs, los históricos y los actuales. Ahora echemos un vistazo a la implementación. En Next.js, tengo una página simple, slug-tsx. Ahora, todo esto se basa en un boilerplate de contenido de Next.js, por lo que no hay mucha funcionalidad. Pero aquí ves que hay dos métodos, getStaticPaths, getStaticProps. Y como mencioné en la presentación al principio, necesitas proporcionar todas las rutas a getStaticPaths o como resultado, a Next.js.

En getStaticProps, necesitas emitir la redirección si es una página que debe ser redirigida. Así que aquí solo necesitamos hacer un cambio simple y agregar al parámetro de elementos el historial también. Así que antes, solo estábamos usando el URL slug, pero ahora queremos usar el historial de URL slug también para obtener realmente todas las rutas. Y ahora necesitamos obtener todas las rutas en una lista simple.

Ahora, si solo obtenemos las rutas en getStaticProps, tendríamos que hacer una verificación adicional de la API con la API de contenido para ver si el slug es uno histórico o un actual. Así que lo que voy a hacer es que voy a crear una lista de todos los slugs y todos los slugs actuales a los que deben redirigir. Ahora, voy a hacer la implementación aquí, voy a avanzar rápidamente y luego voy a explicar el code en un segundo.

Bien, lo que implementé aquí es que estamos obteniendo todas las rutas del CMS de contenido, y en realidad estamos proporcionando todas esas rutas de vuelta como una estructura IPagePath, que puedes ver que contiene solo dos propiedades path y redirectsTo. Path es el URL slug, el actual, y redirectsTo es, en caso de que estemos trabajando con la ruta histórica, aquí vamos a mantener la ruta actual de cualquier página. Así que ves que para el elemento actual que viene del contenido, estamos proporcionando una ruta que es la ruta actual del elemento, la de la versión publicada de la página. Y luego estamos creando una estructura de las rutas históricas, slugs históricos, y redirigen todos a la ruta de la página actual.

Ahora el problema es, realmente no podemos tomar toda la estructura y proporcionarla a Next.js para que la obtengamos en getStaticProps. La razón es, Next.js solo nos permitirá transferir el slug, porque está en el nombre del archivo, es la variable en el camino a la página. Así que no vamos a poder transferir esto a getStaticProps y evitar los problemas de performance. Así que lo que vamos a hacer es, vamos a hacer un truco sugerido por Versal, donde simplemente vamos a tomar todas las rutas, las vamos a serializar en un archivo físico, y luego vamos a tomar ese archivo de vuelta en getStaticProps. Voy a hacer de nuevo la implementación y avanzar rápidamente.

Ahora ves aquí que estoy almacenando todas las rutas en la caché. Lo último que necesito hacer aquí es proporcionar todos los slugs, este es el segundo punto de la presentación. Necesitamos obtener todas las rutas, históricas y actuales, y devolverlas a Next.js aquí. Porque solo estamos diciendo a Next.js, en esta ruta, no hay un 404, hay una página aquí. Y ahora necesitamos hacer el tercer paso, y eso es emitir una redirección adecuada si descubrimos que deberíamos. Así que, en este caso, simplemente estamos tomando la ruta de la caché y si hay una página que debería ser redirigida, tendrá el campo redirects.to. Porque estos son todos los URL slugs históricos, y necesitamos redirigirlos a esta ruta. Así que, podemos hacer una condición simple aquí, si existe path.redirects.to.

3. Implementando Redirecciones y Pensamientos Finales

Short description:

Para realizar la redirección, necesitamos devolver un objeto de redirección que incluya los campos de destino y permanente. El destino debe establecerse desde la raíz del sitio, y el campo permanente determina si se utiliza una redirección 307 o 308. Después de implementar la solución, podemos probarla actualizando la página. El URL slack actual debería mostrar la página correspondiente, y añadiendo el slack anterior debería redirigir a la página correcta. Aunque la implementación puede no ser ideal, elimina la necesidad de que los editores realicen cualquier paso adicional. Si tienes alguna pregunta o quieres compartir tu experiencia con el manejo de URL slacks, no dudes en contactarme en Twitter.

En ese caso, queremos hacer la redirección. Así que vamos a devolver un objeto de redirección, y el objeto de redirección solo necesita contener un destino y un permanente. Así que, permanente, si quieres hacer una redirección 307 o 308, basado en eso, establece el campo permanente. Quiero que permanente sea verdadero. Y en el destino, solo recuerda si estás en la subcarpeta o si estás en la raíz, este va a ser el destino desde la raíz de tu sitio. Así que en mi caso es solo una barra y el camino al que redirige. Así que guardemos esto.

Todavía hay un problema aquí bajo get static paths. Correcto. Lo olvidé. Sí, hay path dot path, porque aquí estamos obteniendo solo el objeto, así que queremos el slack ahí. Ahora, esto está bien. Así que intentemos ejecutar el sitio. Y volvamos al navegador y actualicemos esta página. Ahora, el URL slack actual es TypeScript Congress. Así que en esa página en el URL slack deberíamos tener la página de TypeScript Congress. Así que ves que esto está funcionando. Y el slack anterior era TypeScript Congress 2022. Así que si añadimos aquí 2022 deberíamos ser redirigidos a TypeScript Congress. Así que funciona como se esperaba.

Ahora, la implementación no es ideal para ser honesto, pero funciona de esta manera y nos permite poner todo en orden. Y no, eso es lo más importante, no requiere que los editores hagan ningún paso extra. Simplemente funciona. Y eso es todo por mi parte. Si quieres obtener más información sobre esta solución o quieres compartir tu experiencia manejando URL slacks, entonces definitivamente ponte en contacto conmigo. Puedes encontrarme en Twitter. Y espero que disfrutes el resto de la masterclass.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Concurrent React and Server Components are changing the way we think about routing, rendering, and fetching in web applications. Next.js recently shared part of its vision to help developers adopt these new React features and take advantage of the benefits they unlock.In this talk, we’ll explore the past, present and future of routing in front-end applications and discuss how new features in React and Next.js can help us architect more performant and feature-rich applications.
React Day Berlin 2023React Day Berlin 2023
21 min
React's Most Useful Types
Top Content
We don't think of React as shipping its own types. But React's types are a core part of the framework - overseen by the React team, and co-ordinated with React's major releases.In this live coding talk, we'll look at all the types you've been missing out on. How do you get the props type from a component? How do you know what ref a component takes? Should you use React.FC? And what's the deal with JSX.Element?You'll walk away with a bunch of exciting ideas to take to your React applications, and hopefully a new appreciation for the wonders of React and TypeScript working together.
Vue.js London 2023Vue.js London 2023
30 min
Stop Writing Your Routes
The more you keep working on an application, the more complicated its routing becomes, and the easier it is to make a mistake. ""Was the route named users or was it user?"", ""Did it have an id param or was it userId?"". If only TypeScript could tell you what are the possible names and params. If only you didn't have to write a single route anymore and let a plugin do it for you. In this talk we will go through what it took to bring automatically typed routes for Vue Router.
React Summit 2023React Summit 2023
27 min
The New Next.js App Router
Next.js 13.4 recently released the stable version of the "App Router" – a transformative shift for the core of the framework. In this talk, I'll share why we made this change, the key concepts to know, and why I'm excited about the future of React.
TypeScript Congress 2023TypeScript Congress 2023
31 min
Making Magic: Building a TypeScript-First Framework
I'll dive into the internals of Nuxt to describe how we've built a TypeScript-first framework that is deeply integrated with the user's IDE and type checking setup to offer end-to-end full-stack type safety, hints for layouts, middleware and more, typed runtime configuration options and even typed routing. Plus, I'll highlight what I'm most excited about doing in the days to come and how TypeScript makes that possible not just for us but for any library author.

Workshops on related topic

React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
React Advanced Conference 2022React Advanced Conference 2022
148 min
Best Practices and Advanced TypeScript Tips for React Developers
Top Content
Featured Workshop
Are you a React developer trying to get the most benefits from TypeScript? Then this is the workshop for you.In this interactive workshop, we will start at the basics and examine the pros and cons of different ways you can declare React components using TypeScript. After that we will move to more advanced concepts where we will go beyond the strict setting of TypeScript. You will learn when to use types like any, unknown and never. We will explore the use of type predicates, guards and exhaustive checking. You will learn about the built-in mapped types as well as how to create your own new type map utilities. And we will start programming in the TypeScript type system using conditional types and type inferring.
React Summit 2022React Summit 2022
173 min
Build a Headless WordPress App with Next.js and WPGraphQL
Top Content
WorkshopFree
In this workshop, you’ll learn how to build a Next.js app that uses Apollo Client to fetch data from a headless WordPress backend and use it to render the pages of your app. You’ll learn when you should consider a headless WordPress architecture, how to turn a WordPress backend into a GraphQL server, how to compose queries using the GraphiQL IDE, how to colocate GraphQL fragments with your components, and more.
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Data Fetching Strategies
Top Content
WorkshopFree
- Introduction- Prerequisites for the workshop- Fetching strategies: fundamentals- Fetching strategies – hands-on: fetch API, cache (static VS dynamic), revalidate, suspense (parallel data fetching)- Test your build and serve it on Vercel- Future: Server components VS Client components- Workshop easter egg (unrelated to the topic, calling out accessibility)- Wrapping up
Node Congress 2024Node Congress 2024
83 min
Deep TypeScript Tips & Tricks
Top Content
Workshop
TypeScript has a powerful type system with all sorts of fancy features for representing wild and wacky JavaScript states. But the syntax to do so isn't always straightforward, and the error messages aren't always precise in telling you what's wrong. Let's dive into how many of TypeScript's more powerful features really work, what kinds of real-world problems they solve, and how to wrestle the type system into submission so you can write truly excellent TypeScript code.
React Advanced Conference 2023React Advanced Conference 2023
102 min
Fetch, useEffect, React Query, SWR, what else?
WorkshopFree
In this workshop, first, we’ll go over the different ways you can consume APIs in React. Then, we’ll test each one by fetching content from a headless CMS (with both REST and GraphQL) and checking in detail how they work.
While there is no advanced React knowledge required, this is going to be a hands-on session, so you’ll need to clone a preconfigured GitHub repository and utilize your preferred React programming editor, like VS Code.
You will learn:- What diverse data fetching options there are in React- What are advantages and disadvantages of each- What are the typical use cases and when each strategy is more beneficial than others