Next.js tiene soporte integrado para medir y reportar métricas de rendimiento. Puedes usar el hook useReportWebVitals para gestionar los reportes manualmente, o alternativamente, Vercel ofrece un servicio administrado para recolectar y visualizar métricas automáticamente.
Para necesidades más avanzadas de análisis y monitoreo, Next.js proporciona un archivo instrumentation-client.js|ts que se ejecuta antes de que comience el código frontend de tu aplicación. Esto es ideal para configurar herramientas globales de análisis, seguimiento de errores o monitoreo de rendimiento.
Para usarlo, crea un archivo instrumentation-client.js o instrumentation-client.ts en el directorio raíz de tu aplicación:
instrumentation-client.js
// Inicializar análisis antes de que la aplicación comienceconsole.log('Análisis inicializado')// Configurar seguimiento global de erroreswindow.addEventListener('error', (event) => { // Enviar a tu servicio de seguimiento de errores reportError(event.error)})
Web Vitals son un conjunto de métricas útiles que buscan capturar la experiencia del usuario en una página web. Las siguientes métricas de Web Vitals están incluidas:
Además de las métricas principales mencionadas anteriormente, hay algunas métricas personalizadas adicionales que miden el tiempo que tarda la página en hidratarse y renderizarse:
Next.js-hydration: Tiempo que tarda la página en comenzar y finalizar la hidratación (en ms)
Next.js-route-change-to-render: Tiempo que tarda una página en comenzar a renderizarse después de un cambio de ruta (en ms)
Next.js-render: Tiempo que tarda una página en finalizar el renderizado después de un cambio de ruta (en ms)
Puedes manejar todos los resultados de estas métricas por separado:
export function reportWebVitals(metric) { switch (metric.name) { case 'Next.js-hydration': // manejar resultados de hidratación break case 'Next.js-route-change-to-render': // manejar resultados de cambio de ruta a renderizado break case 'Next.js-render': // manejar resultados de renderizado break default: break }}
Estas métricas funcionan en todos los navegadores que admiten la API de User Timing.
Puedes enviar resultados a cualquier endpoint para medir y rastrear el rendimiento real de los usuarios en tu sitio. Por ejemplo:
useReportWebVitals((metric) => { const body = JSON.stringify(metric) const url = 'https://example.com/analytics' // Usar `navigator.sendBeacon()` si está disponible, recurriendo a `fetch()`. if (navigator.sendBeacon) { navigator.sendBeacon(url, body) } else { fetch(url, { body, method: 'POST', keepalive: true }) }})
Nota importante: Si usas Google Analytics, el valor id te permite construir distribuciones de métricas manualmente (para calcular percentiles, etc.)
useReportWebVitals((metric) => { // Usar `window.gtag` si inicializaste Google Analytics como en este ejemplo: // https://github.com/vercel/next.js/blob/canary/examples/with-google-analytics window.gtag('event', metric.name, { value: Math.round( metric.name === 'CLS' ? metric.value * 1000 : metric.value ), // los valores deben ser enteros event_label: metric.id, // id único para la carga actual de la página non_interaction: true, // evita afectar la tasa de rebote. })})