🚀 Lazy loading y optimizacion del front

Actualizado: 2024-12-01

El rendimiento del front impacta directamente en conversiones y SEO. Google mide Core Web Vitals (LCP, CLS, FID/INP) y penaliza tiendas lentas. Lazy loading y carga diferida son tecnicas esenciales.

#Lazy loading de imagenes

Implementar lazy loading nativo
text
METODO 1: ATRIBUTO NATIVO loading="lazy"
- Soportado en todos los navegadores modernos
- En templates .tpl del tema:
  <img src="{$product.cover.medium.url}" loading="lazy" alt="{$product.name}">
- NO usar en imagenes above-the-fold (hero, logo, primer producto)
  → Estas deben cargar inmediatamente

METODO 2: INTERSECTION OBSERVER (JS)
- Para control mas fino o navegadores legacy
- Usa data-src en lugar de src
- JS detecta cuando la imagen entra en viewport
- Reemplaza data-src por src

EN PRESTASHOP CLASSIC
- Las imagenes de listado de productos NO tienen lazy loading por defecto
- Hay que modificar el template:
  themes/classic/templates/catalog/_partials/miniatures/product.tpl
- Añadir loading="lazy" al tag <img>

EN HUMMINGBIRD (PS 9)
- Lazy loading nativo incluido por defecto
- Tambien usa srcset para imagenes responsive
- Formato WebP automatico si esta disponible

#JavaScript defer y async

Carga diferida de JavaScript
php
<?php

// ── Registrar JS con prioridad baja (se carga al final) ──
public function hookActionFrontControllerSetMedia(): void
{
    // priority: 200 = se carga despues de los scripts core
    $this->context->controller->registerJavascript(
        'mymodule-analytics',
        'modules/' . $this->name . '/views/js/analytics.js',
        [
            'position'  => 'bottom',   // Antes de </body>
            'priority'  => 200,        // Baja prioridad
            'attribute' => 'defer',    // defer = ejecutar despues del parse
        ]
    );

    // async = descargar en paralelo, ejecutar cuando este listo
    $this->context->controller->registerJavascript(
        'mymodule-chat',
        'modules/' . $this->name . '/views/js/chat.js',
        [
            'position'  => 'bottom',
            'priority'  => 300,
            'attribute' => 'async',
        ]
    );
}

// ── DIFERENCIA defer vs async ──
// defer: descarga en paralelo, ejecuta EN ORDEN despues del HTML parse
// async: descarga en paralelo, ejecuta INMEDIATAMENTE (sin orden)
// → defer para scripts que dependen de otros
// → async para scripts independientes (analytics, chat)

// ── Inline JS critico ──
$this->context->controller->registerJavascript(
    'mymodule-critical',
    'modules/' . $this->name . '/views/js/critical.js',
    [
        'position' => 'head',       // En <head>
        'priority' => 10,           // Alta prioridad
        'inline'   => true,         // Inline, sin request HTTP
    ]
);

#Core Web Vitals

MetricaQue mideObjetivoCausa comun en PS
LCP (Largest Contentful Paint)Tiempo hasta que el elemento mas grande es visible< 2.5sImagenes grandes sin optimizar, TTFB lento
CLS (Cumulative Layout Shift)Desplazamiento visual inesperado< 0.1Imagenes sin width/height, banners que aparecen tarde
INP (Interaction to Next Paint)Respuesta a interacciones del usuario< 200msJS bloqueante, handlers pesados en el carrito
FCP (First Contentful Paint)Primer contenido pintado< 1.8sCSS render-blocking, fuentes externas
TTFB (Time to First Byte)Tiempo hasta primer byte del servidor< 0.8sQueries lentas, sin cache de pagina, hosting lento

#Optimizaciones avanzadas

Checklist de optimizacion front
text
IMAGENES
✅ Formato WebP (30% menos que JPEG)
✅ Lazy loading en imagenes below-the-fold
✅ Atributos width y height en TODOS los <img> (evita CLS)
✅ srcset para imagenes responsive
✅ Comprimir con tinypng o squoosh

CSS
✅ Critical CSS inline en <head> (above-the-fold)
✅ Resto de CSS con media="print" onload (carga diferida)
✅ Eliminar CSS no usado (PurgeCSS)
✅ Activar CCC en PS (combinar + minificar)

JAVASCRIPT
✅ defer/async en scripts no criticos
✅ Mover JS al final del body
✅ Eliminar jQuery si usas Hummingbird
✅ Code splitting: cargar modulos JS solo donde se usan
✅ Minimizar third-party scripts (analytics, chat, ads)

SERVIDOR
✅ HTTP/2 o HTTP/3 habilitado
✅ Gzip o Brotli compresion
✅ Cache headers (Cache-Control, ETag)
✅ CDN para assets estaticos
✅ OPcache para PHP
✅ Redis o Memcached para cache de objetos

FUENTES
✅ font-display: swap (evita FOIT)
✅ Preload fuentes criticas: <link rel="preload" as="font">
✅ Alojar fuentes localmente (no Google Fonts externo)
✅ Subset: solo caracteres necesarios (latin vs full unicode)
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.