Rendimiento https://www.carloscarrascal.com/ es Rendimiento en Drupal: Google Page Speed https://www.carloscarrascal.com/blog/rendimiento-en-drupal-google-page-speed <article data-history-node-id="34" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Rendimiento en Drupal: Google Page Speed </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Viernes, Octubre 20, 2017 - 21:44</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div> <div class="field--item"><a href="/tags/rendimiento" hreflang="es">Rendimiento</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><a href="https://developers.google.com/speed/pagespeed/">Page Speed</a> es una herramienta de Google que nos puede ayudar a optimizar el tiempo de carga de nuestro sitio Drupal. No es que lo vaya a arreglar por nosotros, pero al menos nos puede dar varias ideas interesantes de por dónde van los tiros. Para utilizarlo nos va a pedir una URL del sitio que queramos probar, y nos puntúa de 0 a 100 el rendimiento de esa URL teniendo en cuenta varios factores.</p> <p>Sin tocar demasiado de la configuración inicial de Drupal 8, mi sitio estaba alrededor de un 60/65 calificado como Pobre (Poor), tanto para escritorio como para móviles. Para Drupal 7 y sin grandes esfuerzos en sitios pequeños o medianos, es fácil subir por encima de 90 en ambas puntuaciones.</p> <p>Cabe destacar que para poder puntuar bien en el apartado de dispositivos móviles, lo primero es que nuestro <a href="https://es.wikipedia.org/wiki/Dise%C3%B1o_web_adaptable">tema sea adaptable</a> (Responsive). En mi caso estoy utilizando Bootstrap como tema base, que puede que no sea lo mas puntero a día de hoy pero funciona muy bien. A estas alturas puede que parezca una tontería siquiera tener que recordarlo, pero es que aun se ve cada cosa por ahí que asusta.</p> <p>En mi caso, para este sitio, las áreas de mejora eran bastante comunes, vamos a verlas:</p> <h2>Optimizar imágenes</h2> <p>Este es un problema bastante común: las imágenes que mostramos en nuestro sitio son demasiado grandes o no están optimizadas.</p> <p>El primer paso es revisar todas las imágenes de estructura que estemos usando en nuestro diseño, es decir, logos, imágenes para bullets, fondos, etc. que utilice nuestro tema. Por ejemplo, este sitio tiene cuatro imágenes en el pie que van a 40px de alto. Si van fijas a 40px con CSS, pues las imágenes no deberían ser más grandes de ese tamaño, y <em>Page Speed</em> lo va a comprobar.</p> <p>Lo siguiente sería asegurarse que todas las imágenes en contenidos están utilizando un <em>Estilo de imagen</em> apropiado (<em>Image styles</em>) cuando se pintan en la página, con la resolución apropiada. En este sitio, para la versión de escritorio las imágenes que se muestran en los artículos no van ser nunca más anchas de 850px, porque así está definido en el diseño. Prestad atención a las imágenes que van en los teasers, destacados en bloques, etc.</p> <p>Por último, pensemos en los dispositivos móviles. Siguiendo con el ejemplo anterior, si nuestras imágenes son de 850px de ancho, van a ser demasiado grandes para cualquier teléfono. La guinda del pastel es tener configurados diferentes estilos de imágenes para cada uno de los saltos de resolución o media queries que tengamos en nuestro tema. Para esto es muy útil el módulo <a href="https://www.drupal.org/project/breakpoints">Breakpoints</a>, que en Drupal 8 se incluyó en el core.</p> <p>Otro módulo útil para Drupal 8 es <a href="https://www.drupal.org/project/entity_embed">Entity embed</a>, que aunque aún está en beta, funciona bastante bien y nos permite junto con <a href="https://www.drupal.org/project/entity_browser">Entity browser</a> añadir imágenes desde el CKEditor y seleccionar el Image style en que se van a mostrar, con lo que podremos tener todas las imágenes del contenido controladas y responsive.</p> <p>El objetivo final de este proceso de cara a mejorar el rendimiento de nuestro sitio es sencillo: si nuestras imágenes están bien optimizadas, tendrán un menor tamaño, se enviarán menos datos por la red, y tendremos un mejor tiempo de carga.</p> <p> </p> <h2>Minificar archivos CSS y Javascript</h2> <p>Compactar nuestros archivos de estilos y Javascript puede ahorrar un buen montón de bytes que nos ayudará a mejorar otro poquito el rendimiento.</p> <p>El primer paso en este sentido es asegurarse que tenemos activado en el apartado de Configuración / Rendimiento las opciones para agrupar CSS y Javascript, como muestra la siguiente captura.</p> <div alt="Configuración de rendimiento en Drupal 8" data-embed-button="file_browser" data-entity-embed-display="image:image" data-entity-embed-display-settings="full_width" data-entity-type="file" data-entity-uuid="f0ce0fd4-5147-45c9-8684-8ac6ee97a285" title="Configuración de rendimiento en Drupal 8" data-langcode="es" class="embedded-entity"> <img src="/sites/default/files/styles/full_width/public/drupal-rendimiento-configuracion-css-y-javascript.png?itok=Q9GHADw1" alt="Configuración de rendimiento en Drupal 8" title="Configuración de rendimiento en Drupal 8" typeof="foaf:Image" class="img-responsive" /> </div> <p>A partir de aquí el tema se complica un poco mas. Aunque tengamos el mejor y más bonito tema del mundo para nuestro sitio, perfectamente estructurado con Gulp, tirando de mil paquetes de NodeJS, y podamos compilar nuestro SASS o Less y minificarlo nosotros mismos, vamos a estar usando montones de librerías de terceros, código JS y CSS de otros módulos Drupal, etc. que no tiene porqué estar tan bonito como el nuestro.</p> <p>Para remediar esto yo he optado por instalar el módulo <a href="https://www.drupal.org/project/advagg">Advanced CSS/JS Aggregation</a>, que ya habia estado usando en Drupal 7, y nos permite configurar un montón de opciones, entre ellas, minificar todo el código JS y CSS, sin muchas complicaciones, como se puede ver en las siguientes capturas.</p> <div alt="Minificar Javascript con AdvAgg" data-embed-button="file_browser" data-entity-embed-display="image:image" data-entity-embed-display-settings="full_width_shadow file" data-entity-type="file" data-entity-uuid="f74e2f12-297d-440b-8a8e-fbf3264da7c9" title="Minificar Javascript con AdvAgg" data-langcode="es" class="embedded-entity"> <a href="https://www.carloscarrascal.com/sites/default/files/adv-agg-javascript-minificacion.png"><img src="/sites/default/files/styles/full_width_shadow/public/adv-agg-javascript-minificacion.png?itok=U0mi1FYH" alt="Minificar Javascript con AdvAgg" title="Minificar Javascript con AdvAgg" typeof="foaf:Image" class="img-responsive" /> </a> </div> <p> </p> <div alt="Minifica" data-embed-button="file_browser" data-entity-embed-display="image:image" data-entity-embed-display-settings="full_width_shadow file" data-entity-type="file" data-entity-uuid="c0293722-40ac-4c81-8b30-aafc72e37954" title="Minificar CSS con AdvAgg" data-langcode="es" class="embedded-entity"> <a href="https://www.carloscarrascal.com/sites/default/files/adv-agg-css-minificacion.png"><img src="/sites/default/files/styles/full_width_shadow/public/adv-agg-css-minificacion.png?itok=m_6B9zVI" alt="Minifica" title="Minificar CSS con AdvAgg" typeof="foaf:Image" class="img-responsive" /> </a> </div> <h2>Especificar caché de navegador</h2> <p>Este caso es especialmente curioso, porque se queja de este fichero:</p> <ul> <li><a href="https://www.google-analytics.com/analytics.js&amp;nbsp">https://www.google-analytics.com/analytics.js</a> (2 horas)</li> </ul> <p>Es el archivo Javascript de Google Analytics, que carga el módulo. Solucionar este problema fué sencillo, el propio módulo tiene una opción para cachear localmente el Javascript, así que la activamos y adiós a el problema.</p> <div alt="Activar cache de Javascript de Google Analytics" data-embed-button="file_browser" data-entity-embed-display="image:image" data-entity-embed-display-settings="full_width_shadow" data-entity-type="file" data-entity-uuid="c2f2390f-8060-48b3-a8b1-3c25c0fd4a18" title="Activar cache de Javascript de Google Analytics" data-langcode="es" class="embedded-entity"> <img src="/sites/default/files/styles/full_width_shadow/public/drupal-rendimiento-cache-google-analytics.png?itok=shJeF29a" alt="Activar cache de Javascript de Google Analytics" title="Activar cache de Javascript de Google Analytics" typeof="foaf:Image" class="img-responsive" /> </div> <p>Normalmente el resto de opciones de caché estarán correctamente configuradas en una instalación normal de Drupal, gracias al sistema de caché y al fichero <em>.htaccess</em> para Apache que viene por defecto con la distribución.</p> <p> </p> <p> </p> <h2>Eliminar el JavaScript que bloquea la visualización y el CSS del contenido de la mitad superior de la página</h2> <p> </p> <p>Este es el punto que mas quebraderos de cabeza me está dando. Con Drupal 7 si he conseguido solucionarlo usando solamente el módulo AdvAgg y jugando con las opciones. Hay una referencia muy buena <a href="https://groups.drupal.org/node/517292">aquí</a> sobre como configurarlo que a mí me ha dado buenos resultados.</p> <p>Ahora bien, con Drupal 8 aún no he conseguido solucionarlo del todo, y este blog me sigue dando el error. He probado varias configuraciones y no ha habido forma:</p> <ul> <li>Estaba usando el módulo <a href="https://www.drupal.org/project/fontyourface">@font-your-face</a> para cargar las Google Fonts. Como uno de los avisos que da Page Speed era precisamente el de la carga de las fuentes, lo he desactivado y he añadido la fuente directamente en el tema. No ha habido ninguna mejora, pero me he quitado un módulo.</li> <li>He probado diferentes opciones del bundler de AdvAgg pero no he conseguido mejoras tampoco.</li> <li>No he podido activar la opción de AdvAgg para cargar el CSS por medio de Javascript, que creo que es lo que podría ayudar, porque al activarlo deja de funcionar el File Browser para gestionar las imágenes al editar contenidos. Voy a seguir investigando por aquí, porque este punto es la diferencia entre la configuración que me funciona para Drupal 7 y Drupal 8</li> </ul> <p>Ampliaré este artículo si consigo encontrar una solución, de momento cualquier comentario al respecto sería bienvenido.</p> <p> </p> <h2>Conclusiones</h2> <p>Después de los ajustes que hemos visto y el uso del módulo AdvAgg, he pasado de un <strong>60/65</strong> a un <strong>75/90</strong>. Aunque quedan algunas cosas por solucionar, está bastante mejor. En mi caso para la versión móvil, aún tengo que optimizar algunas de las imágenes, que es lo que más me está penalizando, y falta encontrar una solución para el bloqueo causado por el CSS, pero sin mucho esfuerzo ya hemos obtenido bastantes mejoras.</p> <p> </p> <p> </p> <h2>Referencias</h2> <ul> <li>Consejos de configuración de AdvAgg: <a href="https://groups.drupal.org/node/517292">https://groups.drupal.org/node/517292</a></li> <li>Añadir fuentes de Google a nuestro tema: <a href="https://duntuk.com/how-add-google-fonts-drupal-8-theme-proper-way">https://duntuk.com/how-add-google-fonts-drupal-8-theme-proper-way</a></li> </ul> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=34&amp;2=comment&amp;3=comment" token="gyJKxjJnhi5hUMkjsfm99q-H7byLjfyy-BRz08MQALQ"></drupal-render-placeholder> </section> </div> </article> Fri, 20 Oct 2017 19:44:28 +0000 root 34 at https://www.carloscarrascal.com