loading.js

El archivo especial loading.js te ayuda a crear una interfaz de carga significativa con React Suspense. Con esta convención, puedes mostrar un estado de carga instantáneo desde el servidor mientras el contenido de un segmento de ruta se transmite. El nuevo contenido se intercambia automáticamente una vez completado.

Interfaz de carga
export default function Loading() {
  // O un componente esqueleto de carga personalizado
  return <p>Cargando...</p>
}
export default function Loading() {
  // O un componente esqueleto de carga personalizado
  return <p>Cargando...</p>
}

Dentro del archivo loading.js, puedes añadir cualquier interfaz de carga ligera. Puede ser útil usar las Herramientas de desarrollo de React para alternar manualmente los límites de Suspense.

Por defecto, este archivo es un Componente de Servidor - pero también puede usarse como Componente de Cliente mediante la directiva "use client".

Referencia

Parámetros

Los componentes de interfaz de carga no aceptan ningún parámetro.

Comportamiento

  • La interfaz de reserva (fallback) es precargada, haciendo que la navegación sea inmediata a menos que la precarga no se haya completado.
  • La navegación es interrumpible, lo que significa que cambiar de ruta no requiere esperar a que el contenido de la ruta se cargue completamente antes de navegar a otra ruta.
  • Los diseños compartidos permanecen interactivos mientras se cargan los nuevos segmentos de ruta.

Estados de carga instantáneos

Un estado de carga instantáneo es una interfaz de reserva que se muestra inmediatamente al navegar. Puedes pre-renderizar indicadores de carga como esqueletos o spinners, o una parte pequeña pero significativa de las pantallas futuras como una foto de portada, título, etc. Esto ayuda a los usuarios a entender que la aplicación está respondiendo y proporciona una mejor experiencia de usuario.

Crea un estado de carga añadiendo un archivo loading.js dentro de una carpeta.

Archivo especial loading.js
export default function Loading() {
  // Puedes añadir cualquier interfaz dentro de Loading, incluyendo un Skeleton.
  return <LoadingSkeleton />
}
export default function Loading() {
  // Puedes añadir cualquier interfaz dentro de Loading, incluyendo un Skeleton.
  return <LoadingSkeleton />
}

En la misma carpeta, loading.js se anidará dentro de layout.js. Envolverá automáticamente el archivo page.js y cualquier hijo en un límite <Suspense>.

Resumen de loading.js

SEO

  • Next.js esperará a que la obtención de datos dentro de generateMetadata se complete antes de transmitir la interfaz al cliente. Esto garantiza que la primera parte de una respuesta transmitida incluya las etiquetas <head>.
  • Dado que la transmisión se renderiza en el servidor, no afecta al SEO. Puedes usar la herramienta Rich Results Test de Google para ver cómo aparece tu página para los rastreadores web de Google y ver el HTML serializado (fuente).

Códigos de estado

Al transmitir, se devolverá un código de estado 200 para indicar que la solicitud fue exitosa.

El servidor aún puede comunicar errores o problemas al cliente dentro del contenido transmitido, por ejemplo, al usar redirect o notFound. Dado que los encabezados de respuesta ya se han enviado al cliente, el código de estado de la respuesta no se puede actualizar. Esto no afecta al SEO.

Límites del navegador

Algunos navegadores almacenan en búfer una respuesta transmitida. Es posible que no veas la respuesta transmitida hasta que la respuesta supere los 1024 bytes. Esto generalmente solo afecta a aplicaciones de "hola mundo", pero no a aplicaciones reales.

Soporte de plataformas

Opción de despliegueCompatible
Servidor Node.js
Contenedor Docker
Exportación estáticaNo
AdaptadoresDepende de la plataforma

Aprende cómo configurar la transmisión al autoalojar Next.js.

Ejemplos

Transmisión con Suspense

Además de loading.js, también puedes crear manualmente límites de Suspense para tus propios componentes de interfaz. El Enrutador de Aplicaciones admite la transmisión con Suspense.

<Suspense> funciona envolviendo un componente que realiza una acción asíncrona (por ejemplo, obtener datos), mostrando una interfaz de reserva (por ejemplo, esqueleto, spinner) mientras ocurre, y luego intercambiando tu componente una vez que se completa la acción.

import { Suspense } from 'react'
import { PostFeed, Weather } from './Components'

export default function Posts() {
  return (
    <section>
      <Suspense fallback={<p>Cargando feed...</p>}>
        <PostFeed />
      </Suspense>
      <Suspense fallback={<p>Cargando clima...</p>}>
        <Weather />
      </Suspense>
    </section>
  )
}
import { Suspense } from 'react'
import { PostFeed, Weather } from './Components'

export default function Posts() {
  return (
    <section>
      <Suspense fallback={<p>Cargando feed...</p>}>
        <PostFeed />
      </Suspense>
      <Suspense fallback={<p>Cargando clima...</p>}>
        <Weather />
      </Suspense>
    </section>
  )
}

Al usar Suspense, obtienes los beneficios de:

  1. Renderizado de servidor con transmisión - Renderizado progresivo de HTML desde el servidor al cliente.
  2. Hidratación selectiva - React prioriza qué componentes hacer interactivos primero según la interacción del usuario.

Para más ejemplos y casos de uso de Suspense, consulta la Documentación de React.

Historial de versiones

VersiónCambios
v13.0.0Se introdujo loading.