- PageSpeed Insights
Texto traducido por IA.
Resumen de la publicación por la IA de durumis
- Utilizar herramientas de medición de rendimiento web (PageSpeed Insights, Lighthouse) para mejorar el rendimiento de un sitio web beneficia su visibilidad en los motores de búsqueda, siendo los Web Core Vitals un factor clave.
- Para optimizar indicadores como CLS, LCP, FCP y FID, se pueden aplicar técnicas como esqueletos de interfaz de usuario (UI Skeleton), optimización de imágenes, eliminación de elementos que bloquean el renderizado, optimización de fuentes web y procesamiento asincrónico de JavaScript.
- Se presentan los métodos para optimizar cada indicador junto con diversas tecnologías para mejorar el rendimiento web (compresión gzip, web workers, etc.). En el futuro, profundizaremos en estos temas.
A través del sitio web proporcionado por Google
se puede medir fácilmente el rendimiento web.
https://pagespeed.web.dev/
puedes ingresar la URL para medirla o instalar Lighthouse como una extensión de Chrome para medirla.
¿Qué beneficios tiene mejorar los indicadores?
Puede obtener una mejor clasificación en los motores de búsqueda. SEO utiliza mucho el renderizado del lado del servidor, pero
si los indicadores de rendimiento anteriores son bajos, su efecto disminuirá drásticamente.
¿Cómo se mejora?
El sitio web web.dev explica en detalle cómo mejorar cada indicador.
En particular, hay tres indicadores que tienen un gran impacto en la puntuación. (Web Core Vitals)
Quiero registrar los intentos que hice para mejorar los indicadores.
¿Cómo medir localmente?
export default () => { if (process.client && 'PerformanceObserver' in window) { let cumulativeLayoutShiftScore = 0; let largestContentfulPaint = 0; let firstInputDelay = 0; let firstContentfulPaint = 0;
// CLS const clsObserver = new PerformanceObserver((list) => { const entries = list.getEntries(); entries.forEach((entry) => { if (!entry.hadRecentInput) { cumulativeLayoutShiftScore += entry.value; } }); }); // LCP const lcpObserver = new PerformanceObserver((list) => { const entries = list.getEntries(); const lastEntry = entries[entries.length - 1]; largestContentfulPaint = lastEntry.startTime; }); // FID const fidObserver = new PerformanceObserver((list) => { const entries = list.getEntries(); const firstEntry = entries[0]; firstInputDelay = firstEntry.processingStart - firstEntry.startTime; }); // FCP const fcpObserver = new PerformanceObserver((list) => { const entries = list.getEntries(); const firstEntry = entries[0]; firstContentfulPaint = firstEntry.startTime; }); clsObserver.observe({ type: 'layout-shift', buffered: true }); lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true }); fidObserver.observe({ type: 'first-input', buffered: true }); fcpObserver.observe({ type: 'paint', buffered: true }); window.addEventListener('onload', () => { console.log('Final CLS Score:', cumulativeLayoutShiftScore); console.log('LCP:', largestContentfulPaint); console.log('FID:', firstInputDelay); console.log('FCP:', firstContentfulPaint); }); } };
Inserta el código anterior. En el caso de Nuxt, colócalo en plugins y verifica el registro de la consola.
Desplazamiento de diseño acumulativo (CLS)
Es una medida de la cantidad en que el diseño cambia durante el renderizado.
Por ejemplo, supongamos que hay una página que recibe la URL de la imagen a través de la respuesta de la API y representa la imagen de 400x400.
La posición de cierto diseño se desplazará 400 px debido al renderizado de la imagen.
Esto es un movimiento inesperado para el usuario, lo cual no solo es malo para la experiencia del usuario, sino que también afecta indirectamente al navegador al renderizar la pantalla.
Tiene un impacto negativo.
Hay dos formas fáciles de mejorar esto.
1. Aplicar esqueleto de interfaz de usuario
- La mayoría de los sitios web dibujan un esqueleto apropiado para el tamaño de la imagen o el tamaño del componente. Considere esto al desarrollar la pantalla. En el caso de Vue, dibuje un esqueleto apropiado para cada elemento utilizando v-if y v-else.
2. Reservar altura
- Si el esqueleto tiene demasiado estilo, el mantenimiento se vuelve complejo y puede ser contraproducente. Simplemente establecer el min-height del elemento a renderizar puede ser efectivo.
- En el caso de una web responsive, donde el tamaño de la imagen varía según el dispositivo, es difícil fijar la altura. En este caso, puede utilizar el dispositivo más pequeño como referencia o utilizar vh o vw.
3. Especificar ancho y alto en los elementos de imagen
- El ancho y alto de los elementos de imagen se pueden insertar de la siguiente manera.
<img src="image.jpg" width="400" height="400">
Incluso si el tamaño real de la imagen no es 400x400, se informa al navegador del tamaño esperado de la imagen.
4. Utilizar font-display: swap para evitar cambios de diseño debido a fuentes web
- Se indica una fuente alternativa para evitar el desplazamiento del diseño.
Pintura de contenido más grande (LCP)
Es el tiempo que tarda en renderizarse el elemento más grande de la pantalla. Por lo general, será una imagen, por lo que intuitivamente, debe acelerar la velocidad de carga.
1. Reducir el tamaño de la imagen.
- Comprueba si el tamaño de la imagen no es demasiado grande en relación con el tamaño de renderizado.
- Optimizar el renderizado de imágenes con extensiones como webp. WebP es aproximadamente un 30% más pequeño que el formato JPEG si se utiliza la compresión con pérdida y aproximadamente un 20% más pequeño que el PNG si se utiliza la compresión sin pérdida.
- También se puede considerar la carga diferida que carga las imágenes según la posición de desplazamiento.
2. Utilizar caché o CDN.
3. Eliminar elementos que bloquean el renderizado.
- Dado que la mayoría de los indicadores de medición se ven afectados, asegúrese de eliminarlos. Cuando el navegador representa una pantalla, primero obtiene los scripts en la etiqueta head y luego representa, por lo que debe verificar si los scripts en la etiqueta head (generalmente scripts externos) deben renderizarse primero. Puede administrarlo fácilmente utilizando las etiquetas async y defer.
* Escribiré una publicación de blog separada sobre los atributos de los scripts en head más adelante.
4. Minimizar el tamaño del paquete.
- Independientemente de la velocidad de renderizado de la imagen, si la transmisión desde el servidor es lenta, debe mejorarse.
Si utilizas un servidor proxy como Nginx, puedes utilizar la compresión gzip.
* Escribiré otra publicación de blog sobre la configuración de Nginx más adelante.
Primera pintura de contenido (FCP)
Se refiere al momento en que se representa el primer contenido de la página.
1. Eliminar elementos que bloquean el renderizado, como antes.
2. Minimizar el tamaño del HTML.
- Si envuelves indiscriminadamente con etiquetas div, se crea un árbol muy anidado y el tamaño del archivo también aumenta.
3. Las fuentes web externas pueden ser un problema. Utilice font-display: swap; activamente para renderizar la fuente predeterminada primero.
Retraso de la primera entrada (FID)
Se refiere al tiempo que tarda el navegador en procesar la primera entrada del usuario en la página (clic, desplazamiento, etc.). A veces, incluso si presionas un botón, no funciona, pero en realidad no está inactivo, sino que puede estar esperando una respuesta de la API.
1. Utilizar asincronía correctamente para que el hilo principal de JavaScript no se bloquee con tareas pesadas.
2. Se puede utilizar un trabajador web para realizar otra tarea por separado del hilo principal.
* Escribiré otra publicación de blog sobre los trabajadores web más adelante.
Lo dejaré aquí debido al límite de palabras.