Carga previa de la ruta en Next.js

Cómo acelera Next.js las navegaciones con la carga previa de rutas y cómo personalizarla

¿Qué aprenderás?

En esta publicación, obtendrás información sobre cómo funciona el enrutamiento de Next.js, cómo se optimiza para ofrecer velocidad y cómo personalizarlo para que se adapte mejor a tus necesidades.

En Next.js, no necesitas configurar el enrutamiento manualmente. Next.js usa el enrutamiento basado en el sistema de archivos, que te permite crear archivos y carpetas dentro del directorio ./pages/:

Captura de pantalla del directorio de páginas que contiene tres archivos: index.js, margherita.js y pine-pizza.js.

Para vincular a diferentes páginas, usa el componente <Link>, de manera similar a como usarías el elemento <a> anterior:

<Link href="/margherita">
  <a>Margherita</a>
</Link>

Cuando usas el componente <Link> para la navegación, Next.js hace un poco más por ti. Por lo general, una página se descarga cuando sigues un vínculo a ella, pero Next.js realiza una carga previa del código JavaScript necesario para procesar la página de forma automática.

Cuando cargas una página con algunos vínculos, lo más probable es que, cuando sigas un vínculo, el componente detrás de este ya se haya recuperado. Esto mejora la capacidad de respuesta de la aplicación, ya que agiliza la navegación a páginas nuevas.

En la siguiente app de ejemplo, la página index.js se vincula a margherita.js con un <Link>:

Usa las Herramientas para desarrolladores de Chrome para verificar que margherita.js se haya cargado previamente: 1. Para obtener una vista previa del sitio, presiona Ver app. Luego, presiona Pantalla completa pantalla completa.

  1. Presiona "Control + Mayús + J" (o bien "Comando + Opción + J" en Mac) para abrir Herramientas para desarrolladores.
  2. Haga clic en la pestaña Red.

  3. Selecciona la casilla de verificación Inhabilitar caché.

  4. Vuelve a cargar la página.

Cuando cargas index.js, la pestaña Red muestra que margherita.js también se descargó:

Pestaña Network de Herramientas para desarrolladores con margherita.js destacada.

Cómo funciona la carga previa automática

Next.js carga previamente solo los vínculos que aparecen en el viewport y usa la API de Intersection Observaer para detectarlos. También inhabilita la carga previa cuando la conexión de red es lenta o cuando los usuarios tienen activado Save-Data. Según estas verificaciones, Next.js inserta etiquetas <link rel="preload"> de forma dinámica para descargar componentes para las navegaciones posteriores.

Next.js solo recupera el código JavaScript; no lo ejecuta. De esa manera, no se descargará ningún contenido adicional que la página cargada previamente pueda solicitar hasta que visites el vínculo.

Cómo evitar cargas previas innecesarias

Para evitar descargar contenido innecesario, puedes inhabilitar la carga previa de las páginas que se visitan con poca frecuencia configurando la propiedad prefetch de <Link> en false:

<Link href="/pineapple-pizza" prefetch={false}>
  <a>Pineapple pizza</a>
</Link>

En esta segunda app de ejemplo, la página index.js tiene un <Link> por pineapple-pizza.js con prefetch establecido en false:

Para inspeccionar la actividad de red, sigue los pasos del primer ejemplo. Cuando cargas index.js, la pestaña Red de Herramientas para desarrolladores muestra que se descargó margherita.js, pero pineapple-pizza.js no:

Pestaña Network de Herramientas para desarrolladores con margherita.js destacada.

Carga previa con enrutamiento personalizado

El componente <Link> es adecuado para la mayoría de los casos de uso, pero también puedes compilar tu propio componente para realizar el enrutamiento. Next.js te facilita esta tarea con la API de router disponible en next/router. Si deseas realizar una acción (por ejemplo, enviar un formulario) antes de navegar a una ruta nueva, puedes definirlo en el código de enrutamiento personalizado.

Cuando usas componentes personalizados para el enrutamiento, también puedes agregarles carga previa. Para implementar la carga previa en tu código de enrutamiento, usa el método prefetch de useRouter.

Observa components/MyLink.js en esta app de ejemplo:

La carga previa se realiza dentro del hook useEffect. Si la propiedad prefetch de una <MyLink> se establece en true, la ruta especificada en la propiedad href realiza una carga previa cuando se renderiza ese <MyLink>:

useEffect(() => {
    if (prefetch) router.prefetch(href)
});

Cuando hagas clic en el vínculo, el enrutamiento se realizará en handleClick. Se registra un mensaje en la consola y el método push navega a la ruta nueva especificada en href:

const handleClick = e => {
    e.preventDefault();
    console.log("Having fun with Next.js.");
    router.push(href);
};

En esta app de ejemplo, la página index.js tiene una <MyLink> para margherita.js y una pineapple-pizza.js. La propiedad prefetch está configurada como true el /margherita y como false el /pineapple-pizza.

<MyLink href="/margherita" title="Margherita" prefetch={true} />
<MyLink href="/pineapple-pizza"  title="Pineapple pizza" prefetch={false} />

Cuando cargas index.js, la pestaña Red muestra que margherita.js se descargó y que pineapple-pizza.js no:

Pestaña Network de Herramientas para desarrolladores con margherita.js destacada.

Cuando haces clic en cualquiera de los vínculos, la consola registra "Divertirse con Next.js" y navega a la ruta nueva:

La consola de Herramientas para desarrolladores muestra el mensaje &quot;Divertirse con Next.js&quot;.

Conclusión

Cuando usas <Link>, Next.js carga automáticamente el código JavaScript necesario para renderizar la página vinculada, lo que agiliza la navegación a páginas nuevas. Si usas el enrutamiento personalizado, puedes usar la API de router de Next.js para implementar la carga previa. Evita descargar contenido innecesariamente. Para ello, inhabilita la carga previa de las páginas que se visitan con poca frecuencia.