- 1. Optimizar imágenes
- 2. Minificar CSS y JS
- 3. Especificar caché de navegador
- 4. Habilita la compresión
- 5. Reducir el tiempo de respuesta del servidor
- 6. Eliminar el JavaScript que bloquea la visualización del contenido de la mitad superior de la página
- 7. Eliminar el CSS que bloquea la visualización del contenido de la mitad superior de la página
Sexta entrada sobre cómo mejorar la puntuación en PageSpeed Insights. En esta ocasión hablaremos sobre cómo eliminar el JavaScript que bloquea la visualización del contenido de la mitad superior de la página.
Los archivos JS deben cargarse en el footer, justo antes del cierre de la etiqueta </body>.
Cuando un navegador carga una página web, los recursos JavaScript y CSS normalmente impiden que se muestre la página web hasta que se descarguen y procesen por el navegador. Algunos recursos deben ser descargados y procesados antes de mostrar cualquier elemento. Para obtener la experiencia más rápida posible para sus usuarios, es necesario cargar los scripts al final del documento, justo antes del cierre.
Para conseguir esto, cuando estemos desarrollando un tema o plugin deberemos cargar los ficheros JS de la siguiente forma:
<?php
function scripts_to_footer() {
wp_enqueue_script( 'my-scripts', get_template_directory_uri() . '/js/scripts.min.js', array( 'jquery' ), '', true );
}
add_action( 'wp_enqueue_scripts', 'scripts_to_footer' );
Estableciendo el último parámetro $in_footer a true.
¿Qué pasa si estamos utilizando plugins que cargan archivos JS en el head? Debemos añadir una función más para mover los scripts del head al footer de nuestro sitio:
<?php
function move_scripts_from_head_to_footer() {
remove_action( 'wp_head', 'wp_print_scripts' );
remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
add_action( 'wp_footer', 'wp_print_scripts', 5);
add_action( 'wp_footer', 'wp_enqueue_scripts', 5);
add_action( 'wp_footer', 'wp_print_head_scripts', 5);
}
add_action( 'wp_enqueue_scripts', 'move_scripts_from_head_to_footer' );
Con todo esto conseguiremos que nuestros scripts estén en el footer, por lo tanto no bloquearemos la carga de contenido y aprobaremos este punto en PageSpeed.
Atributo async
Si no indicamos nada el script se ejecutará inmediatamente, bloqueando el parseo del resto del documento.
El atributo async se introduce en HTML5 para indicar que el script debe cargarse de forma asíncrona, es decir, sin bloquear la presentación del resto de elementos del contenido, y debe ejecutarse inmediatamente cuando se haya descargado.
<script async src="scripts.js"></script>
En WordPress podemos añadir el siguiente fragmento de código en nuestro archivo functions.php:
<?php
function add_async_attr_to_all_scripts($tag){
return str_replace( ' src', ' async="async" src', $tag );
}
add_filter( 'script_loader_tag', 'add_async_attr_to_all_scripts', 10 );
Atributo defer
El atributo defer se utiliza para evitar que los scripts bloqueen la presentación del resto de la página. El funcionamiento es similar a async, salvo que defer indica que el script se ejecute cuando la página se ha terminado de parsear.
Es decir, si el atributo defer está presente el script se ejecuta cuando la página se ha terminado de parsear. Si el atributo async está presente el script se ejecuta de forma asíncrona tan pronto como esté disponible. Y si estuvieran ambos presentes, async predomina sobre defer.
En WordPress podemos añadir el siguiente fragmento de código en nuestro archivo functions.php:
<?php
function add_defer_attr_to_all_scripts( $tag ){
return str_replace( ' src', ' defer="defer" src', $tag );
}
add_filter( 'script_loader_tag', 'add_defer_attr_to_all_scripts', 10 );
OJO
Debemos tener mucho cuidado a la hora de cargar JavaScripts de forma asíncrona. Podría darse el caso de cargar por ejemplo jQuery y una librería dependiente de jQuery y que ésta segunda librería se cargue antes que jQuery aunque la hayamos puesto a continuación en nuestro documento.
Para que se entienda visualmente, y podamos decidir en qué casos debemos optar por async o defer: