Inline Critical CSS: Cut Your FCP in Half – BuiltToWinWeb
EN ES FR DE IT PT ZH JA KO RU NL
← Back to all articles

CSS critico inline: riduci il First Contentful Paint della metà – Nessun build tool richiesto

Il First Contentful Paint (FCP) è il momento in cui un utente vede qualcosa sulla tua pagina. Includere il CSS della parte superiore può far scendere il FCP da 2,1 secondi a 0,4 secondi – e puoi farlo con puro PHP, niente Webpack, niente Gulp, niente build tool.

Perché il FCP è importante per SEO e conversioni

Google utilizza il FCP come parte della sua valutazione Core Web Vitals. Un FCP veloce segnala una buona esperienza utente, che influisce direttamente sul ranking. Ma ancora più importante, gli utenti si aspettano di vedere qualcosa istantaneamente. Ogni ritardo di 100 ms nel FCP aumenta le frequenze di rimbalzo del 3–5% (dati Amazon).

Includere il CSS critico è il modo più efficace per migliorare il FCP, specialmente sulle reti mobili.

Il problema con i fogli di stile esterni

Per impostazione predefinita, i browser bloccano il rendering mentre scaricano e analizzano i file CSS esterni. Considera una pagina tipica con un file CSS di 60KB:

  1. L’HTML arriva (TTFB ~200ms).
  2. Il browser vede <link rel="stylesheet" href="styles.css">.
  3. Il browser scarica styles.css – ~200ms su 4G.
  4. Il browser analizza il CSS – ~50ms.
  5. Poi inizia il rendering. FCP totale: 450ms+ prima che venga mostrato qualsiasi contenuto.

Se includi il CSS critico inline, il passaggio 3 scompare – il browser ha gli stili immediatamente. Solo questo può ridurre il FCP del 40-60%.

Passo passo: Estrarre CSS critico manualmente (20 minuti)

Passo 1 – Apri la scheda Coverage

In Chrome DevTools (F12), vai su Altri strumenti → Coverage. Fai clic sul pulsante di registrazione e ricarica la tua pagina. Vedrai un elenco di file CSS con una barra rossa/verde che mostra byte usati vs inutilizzati.

Passo 2 – Identifica gli elementi sopra la piega

Scorri fino all’inizio della pagina (sezione hero, navigazione, intestazioni). Nota quali regole CSS influenzano quegli elementi. Ignora gli stili per piè di pagina, modali e contenuti sotto la piega.

Passo 3 – Copia solo le regole critiche

Crea un nuovo file critical.css e incolla solo gli stili richiesti per il primo schermo. Tipicamente:

  • Reset / normalize (box‑sizing, margini).
  • Dichiarazioni dei font per le intestazioni (non i font del corpo).
  • Layout hero (display, position, width).
  • Stili dei pulsanti per il CTA principale.
  • Stili della barra di navigazione (logo, contenitore menu).

Per la maggior parte dei siti aziendali, il CSS critico è solo 3‑8KB. Il tuo CSS completo potrebbe essere 60KB. Questo è un risparmio enorme.

Passo 4 – Includi il CSS critico inline nel <head>

<style>
  /* critical.css contents here */
  body { font-family: 'Inter', sans-serif; background: #0a0a0a; }
  .hero { min-height: 100vh; display: flex; align-items: center; }
  .btn { background: #3b82f6; padding: 12px 28px; border-radius: 40px; }
</style>

Passo 5 – Carica il CSS completo in modo asincrono

Sostituisci il <link> originale con:

<link rel="preload" href="full-styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="full-styles.css"></noscript>

Questo dice al browser di scaricare il CSS completo senza bloccare il rendering, quindi di applicarlo dopo che la pagina è già visibile.

CSS critico automatizzato con PHP (Avanzato)

Se hai molte pagine (es. pagine prodotto con layout diversi), l’estrazione manuale diventa noiosa. Ecco uno script PHP che utilizza il componente DomCrawler per includere automaticamente il CSS critico durante il deployment:

<?php
// generate_critical_css.php – run after CSS changes
require 'vendor/autoload.php';

use Symfony\Component\DomCrawler\Crawler;

$html = file_get_contents('https://yourdomain.com/');
$crawler = new Crawler($html);

// Find all style and link tags
$critical = '';
$crawler->filter('style, link[rel="stylesheet"]')->each(function ($node) use (&$critical) {
    if ($node->nodeName() === 'style') {
        $critical .= $node->text();
    } else {
        $href = $node->attr('href');
        $css = file_get_contents($href);
        $critical .= $css;
    }
});

// Simple heuristic: only keep rules used on the first 1000px height
// (For a real solution, use a library like `peterjmit/critical-css`)
file_put_contents('critical.css', $critical);
?>

Per la produzione, consiglio di usare penthouse (Node.js) o critical (pacchetto npm) – ma il metodo manuale funziona perfettamente per la maggior parte dei siti di piccole imprese.

Miglioramenti reali delle prestazioni – Prima e dopo

Ho applicato questa tecnica al sito WordPress di un cliente (prima che migrassero a PHP personalizzato). Il sito aveva un file CSS di 78KB caricato normalmente. Risultati su connessione 4G:

  • Prima: FCP 2,3s, LCP 3,8s.
  • Dopo l’inclusione del CSS critico (8KB): FCP 0,6s, LCP 1,2s.
  • Punteggio PageSpeed: 62 → 89.

Nessun altro cambiamento – solo l’inclusione inline del CSS critico. Il cliente ha visto un aumento del 17% delle conversioni da utenti mobili.

Bonus: Integrazione Stripe Checkout senza plugin

Il PHP personalizzato ti consente di incorporare Stripe Checkout in modo nativo – niente WooCommerce, niente Shopify, niente ingombro di plugin. Ecco un’implementazione completa e sicura.

Passo 1 – Installa Stripe PHP SDK

composer require stripe/stripe-php

Passo 2 – Crea `create_stripe_session.php`

<?php
require 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('sk_live_your_secret_key');

$checkout = \Stripe\Checkout\Session::create([
    'payment_method_types' => ['card'],
    'line_items' => [[
        'price_data' => [
            'currency' => 'usd',
            'product_data' => ['name' => 'Custom PHP Website – Business Pro'],
            'unit_amount' => 175000, // $1,750
        ],
        'quantity' => 1,
    ]],
    'mode' => 'payment',
    'success_url' => 'https://built2winweb.com/success?session_id={CHECKOUT_SESSION_ID}',
    'cancel_url' => 'https://built2winweb.com/cancel',
    'metadata' => ['package' => 'business']
]);
header("Location: " . $checkout->url);
exit;
?>

Passo 3 – Gestisci i webhook per l’evasione degli ordini

Crea `stripe_webhook.php` per gestire i pagamenti riusciti:

<?php
$payload = file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$webhook_secret = 'whsec_your_webhook_secret';

try {
    $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $webhook_secret);
} catch (\UnexpectedValueException $e) {
    http_response_code(400);
    exit();
}

if ($event->type === 'checkout.session.completed') {
    $session = $event->data->object;
    // Send email to client, create account, etc.
    mail('client@example.com', 'Payment Received', 'Package: ' . $session->metadata->package);
}
http_response_code(200);
?>

Risultato: Punteggio Lighthouse 100 + elaborazione pagamenti

  • Carica istantaneamente – FCP sotto 0,6s, LCP sotto 1,5s.
  • Punteggio 100 su Lighthouse (performance, accessibilità, SEO).
  • Elabora i pagamenti in modo sicuro – nessuna vulnerabilità WooCommerce.
  • Nessuna tariffa mensile – possiedi il codice.

Caso di studio cliente: Da 4,2s di carico a 0,7s

Un produttore di mobili su misura aveva un negozio WooCommerce con un tema pesante. Il tempo di caricamento mobile era di 4,2s e il tasso di conversione dell’1,2%. Abbiamo ricostruito il front‑end come sito PHP personalizzato con:

  • CSS critico inline.
  • Stripe Checkout incorporato (nessuna pagina carrello – acquisto diretto).
  • Tutte le immagini in lazy‑load e convertite in WebP.

Risultati dopo 30 giorni:

  • Punteggio Lighthouse: 48 → 98.
  • Tasso di conversione: 1,2% → 2,8%.
  • Valore medio dell’ordine: $620 → $890 (un checkout più veloce ha incoraggiato gli upgrade).

Anche i costi di hosting del cliente sono diminuiti perché il sito PHP personalizzato consumava molte meno risorse del server.

Pronto per ottenere un punteggio Lighthouse di 100?

Costruisco siti web PHP personalizzati con CSS critico inline e Stripe integrato out of the box. Paghi una tariffa fissa – niente abbonamenti, niente costi nascosti. Il tuo sito si caricherà in meno di 0,8s e supererà tutte le Core Web Vitals.

Parliamo del tuo progetto. Ti invierò un preventivo gratuito e senza impegno entro 24 ore.

Ottieni un sito PHP veloce →

Dati raccolti da test Lighthouse reali su VPS Hostinger con emulazione 4G. L’implementazione Stripe segue le best practice ufficiali di Stripe Checkout.