Drupal amb Lazy builder i BigPipe
Lazy Builders a Drupal: Carregar només el just… i quan cal
Imagina que vas a un restaurant i demanes un menú amb molts plats. El cambrer podria portar-te tot de cop (el que triga molt i omple la taula de seguida), o podria portar-te primer allò essencial, i després, la resta.
Això és, més o menys, el que fan els lazy builders a Drupal: permeten que primer es carregui el contingut estàtic i després el contingut més dinàmic. Amb aquesta tècnica, s’aconsegueix que l’experiència de l’usuari sigui més ràpida, fluïda i, de passada, ajuda que Google ens miri amb millors ulls.
Relació amb el rendiment, la UX i el SEO (mètriques web)
Les mètriques web són una iniciativa de Google per oferir una guia unificada sobre els indicadors de qualitat essencials per oferir una gran experiència d’usuari a la web.
Com que Google mou prop del 90% de les cerques, això és força rellevant: la teva puntuació en Core Web Vitals afecta el teu SEO.
Drupal, amb el seu potent sistema de memòria cau i eines com BigPipe, pot destacar si utilitzem Lazy Builders de manera estratègica.
Actualment hi ha 3 mètriques:
Largest Contentful Paint (LCP): mesura quant triga a carregar el contingut visible més gran de la pantalla. És una mètrica clau perquè els usuaris interpreten aquest temps com un indicador de si la pàgina carrega ràpidament.
L’ús de Lazy Builders pot reduir la càrrega inicial enviant primer els blocs visibles més pesats com a placeholders, permetent que el contingut principal es carregui més ràpidament.
Interaction to Next Paint (INP): mesura el temps que triga el navegador a respondre a la primera interacció de l’usuari (com fer clic en un enllaç o botó, o fer servir un control de JavaScript).
Amb menys contingut carregant-se al principi, el navegador pot respondre més ràpid a les primeres accions.
Cumulative Layout Shift (CLS): mesura el moviment inesperat del contingut a la pàgina. Per exemple, si estàs llegint un article i una imatge carrega a la part superior, desplaçant el text, això suma al CLS.
Tenint placeholders amb una alçada definida, s’eviten aquests salts visuals pel retard en carregar contingut.
Què són els Lazy Builders?
Els Lazy Builders són una manera d’indicar a Drupal que tenim contingut que s’hauria de carregar de forma diferida. Amb això, Drupal detecta que hi ha una part del contingut que s’ha de carregar posteriorment i, en lloc de mostrar-lo de seguida, posa un “espai reservat” (placeholder). Continua generant la resta de la pàgina, i després aquell espai es reemplaça pel contingut real, ja sigui durant el mateix procés (al servidor) o més endavant (al navegador), segons la configuració del teu lloc.
Si utilitzes el mòdul BigPipe, que està inclòs al nucli des de Drupal 8.3 i al perfil estàndard des de la 8.5, aquest procés és encara millor: els marcadors es reemplacen amb contingut real mentre l’usuari ja veu la pàgina, donant una sensació de velocitat molt bona.
Com funcionen?
Quan Drupal troba un #lazy_builder dins un render array:
- Reemplaça el contingut per un placeholder únic.
- Renderitza i desa a la memòria cau l’HTML amb aquests placeholders.
- Segons l'estratègia de render:
- Amb "single flush", Drupal genera tot de cop i retorna la pàgina completa.
- Amb BigPipe, s’envia l'HTML principal i els placeholders es completen progressivament amb JavaScript al navegador.
Si estàs creant un bloc o contingut renderitzable a Drupal, pots definir un lazy builder així dins el render array:
return [
'#lazy_builder' => ['\Drupal\meu_modul\Controller\MiClase::miFuncio', ['argument1']],
'#create_placeholder' => TRUE,
];
Això li diu a Drupal:
- Quina funció ha de generar aquest contingut.
- Que ha de crear un placeholder, no mostrar-ho de seguida.
I dins d'aquesta funció defines què mostraràs, com qualsevol bloc o contingut renderitzat.
*Important: aquesta funció ha de ser estàtica i pública, i els arguments han de ser segurs (mai objectes o dades complexes).
Quan convé usar lazy builders?
- Contingut que canvia molt sovint
Per exemple, nombre d’usuaris connectats, dades en temps real o notícies. Posar això dins la memòria cau general provocaria que s'invalidés tota la pàgina cada pocs minuts. - Contingut personalitzat per a cada usuari
Com ara el nom del usuari, l’avatar o menús d'accés ràpid. Sense lazy builder, caldria una versió cachejada per cadascun, cosa que fa créixer exponencialment les combinacions possibles. Contingut que triga molt a generar-se
Si tens un bloc que crida una API externa o fa moltes consultes, millor que no freni tota la pàgina. Posant-lo com a lazy builder, es mostra quan estigui llest.
Però no tot és màgia… Quan NO és tan útil?
Si la pàgina està totalment cachejada amb Page Cache (i no hi ha sessió d’usuari), els lazy builders no es posen en marxa...
Per què?
Perquè el navegador rep una pàgina HTML ja generada i guardada, amb tot el contingut estàtic. No cal construir res nou, per tant els placeholders ni tan sols hi apareixen: està tot “precuinat”.
Conclusió
Els lazy builders a Drupal són una eina molt útil per millorar el rendiment del lloc, especialment quan hi ha continguts personalitzats, dinàmics o pesats de generar.
En combinació amb BigPipe, el potencial és enorme: la pàgina es mostra ràpidament i es completa mentre l’usuari ja l’està llegint. La sensació de velocitat és real.
En resum:
- Separes el contingut urgent del pesat.
- L’usuari veu abans el que importa.
- La teva memòria cau es conserva millor i el servidor pateix menys.
No tot necessita lazy load, però si s'usa correctament, pot transformar el teu Drupal.