Non usare @import

Wordle: Non usare @importL’ utilizzo della regola @import per caricare file CSS aggiuntivi e’ una cattiva pratica che ha influenze negative sulle prestazioni del nostro sito web. Cio’ che dimostrermo e’ che invece di usare @import e’ meglio usare LINK.

LINK contro @import

Ci sono due modi per includere un foglio di stile in una pagina web. Possiamo usare il tag LINK

<link rel='stylesheet' href='a.css' >

o la regola @import:

<style>
@import url(' a.css' );
</style>

E’ preferibile usare LINK per semplicita’ – non dobbiamo ricordarci di piazzare @import all’ inizio del blocco degli stili, poiche’ altrimenti non funzionerebbe -ma evitare la regola @import ha un impatto anche sulla performance della pagina.

@import @import

Vediamo i vari modi in cui LINK e @import possono essere usati. Nei seguenti esempi avremo due fogli di stile: a.css e b.css. Ogni foglio di stile e’ configurato per essere scaricato in due secondi, per notare meglio le differenze nelle prestazioni.

Il primo esempio usa la regola @import per inserire i due file CSS. In questo, chiamato @import @import, il documento HTML contiene il seguente codice:

<style>
@import url(' a.css' );
@import url(' b.css' );
</style>

Se usiamo sempre @import in questa maniera, non troviamo problemi di prestazioni, come possiamo vedere qui sotto. I due fogli di stile vengono scaricati in parallelo (Figura 1). La piccola barra precedente si riferisce alla richiesta del file HTML.

import-import

Figura 1. usare sempre @import va bene

Il problema sorge quando @import viene incluso all’ interno di un altro foglio di stile o usato in contemporanea a LINK.

LINK @import

L’ esempio LINK @import usa LINK per a.css e @import per b.css:

<link rel='stylesheet' type='text/css' href='a.css' >
<style>
@import url(' b.css' );
</style>

In Internet Explorer (testato sulle versioni 6, 7 e 8), questo causa lo scaricamento seriale dei fogli di stile come mostrato in Figura 2. Scaricare risorse in parallelo e’ la chiave per ottenere prestazioni maggiori. Come vediamo qui, questo comportamento in IE richiede un tempo di download maggiore:

Figura 2. Utilizzare LINK con @import impedisce lo scaricamento parallelo in IE

Figura 2. Utilizzare LINK con @import impedisce lo scaricamento parallelo in IE

LINK con @import

Nell’ esempio LINK con @import, a.css viene scaricato usando LINK e b.css usando @import all’ interno di a.css:
nel documento HTML:

<link rel='stylesheet' type='text/css' href='a.css' >

a.css:

@import url(' b.css' );

Anche questa combinazione non permette il download in parallelo, ma stavolta in nessun browser, non solo in IE. Se ci fermiamo a riflettere, non e’ una grossa sorpresa: il browser deve scaricare il primo file ed esaminarlo. A questo punto il browser vede la regola @import e inizia a scaricare il secondo file CSS.

link-with-import

Figura 3. Usare @import all' interno di un file CSS che usa LINK non permette il download contemporanero in nessun browser

LINK blocca @import

Una leggera variante dell’ esempio precedente con risultati sorprendenti in IE: LINK viene usato per a.css e per una file aggiuntivo chiamato proxy.css. proxy.css e’ configurato per contenere la regola @import per caricare b.css.
Nel documento HTML:

<link rel='stylesheet' type='text/css' href='a.css' >
<link rel='stylesheet' type='text/css' href='proxy.css' >

in proxy.css:

@import url(' b.css' );

Il risultato in IE, LINK blocca @import, e’ visibile in Figura 4. La prima richiesta e’ il documento HTML; la seconda richiesta e’ a.css (2 secondi): la terza (piccola) richiesta e’ proxy.css; la quarta richiesta e’ b.css (2 secondi). Sorprendentemente, IE non inizia a scaricare b.css finche’ a.css non e’ completamente scaricato. In tutti gli altri browser, il problema non esiste: il risultato e’ una pagina scaricata piu’ velocemente (Figura 5).

Figura 4. LINK blocca @import in IE

Figura 4. LINK blocca @import in IE

Figura 5. LINK non blocca @import negli altri browser

Figura 5. LINK non blocca @import negli altri browser

Vari @import

L’ esempio Vari @import dimostra che usandoi @import in IE causa lo scaricamento dei file in un ordine diverso da quello specificato. Questo esempio ha 6 fogli di stile (ognuno viene scaricato in 2 secondi) seguiti da uno script (4 secondi per il download).

<style>
@import url(' a.css' );
@import url(' b.css' );
@import url(' c.css' );
@import url(' d.css' );
@import url(' e.css' );
@import url(' f.css' );
</style>
<script src=' one.js' type='text/javascript' ></script>

Guardando la Figura 6, la barra piu’ lunga e’ lo script da 4 secondi. Anche se posizionato in fondo alla lista, IE lo scarica per primo. Se lo script ha del codice che dipende da uno stile importato (per esempio getElementsByClassName, ecc.), possiamo incontare problemi.

Figura 6. @import causa download fuori ordine in IE

Figura 6. @import causa download fuori ordine in IE

LINK con @import – Vari LINK

Questi due esempi includono 4 fogli di stile nel documento HTML. LINK con @imports usa LINK per caricare proxy.css; proxy.css quindi usa @import per caricare 4 fogli di stile. Vari LINK ha 4 LINK nel documento per inserire i 4 file (raccomandato). Le richieste HTTP sono mostrate nelle Figure 7 e 8.

Figura 8. LINK con @import

Figura 7. LINK con @import (clicca per ingrandire)

Figura 9. Vari LINK (clicca per ingrandire)

Figura 8. Vari LINK (clicca per ingrandire)

Se guardiamo LINK con @import, il primo problema che sorge e’ che i nostri 4 file non iniziano ad essere sacaricati finche’ non viene analizzato proxy.css.Questo accade in tutti i browser. Dall’ altra parte, Vari LINK inizia a scaricare i fogli immediatamente.

Il secondo problema e’ che IE cambia l’ ordine del download. Aggiungiamo uno script da 10 secondi (la barra piu’ lunga) in fondo alla pagina. In tutti gli altri browser i fogli che usano la regola @import (dal file proxy.css) vengono scaricati prima e lo script alla fine, nell’ ordine specificato. In IE lo script viene scaricato prima di @import, come mostrato in Figura 7. Questo fa si che i fogli di stile impieghino piu’ tempo ad essere scaricati poiche’ lo script occupa per 10 secondi una delle due possibili connessioni HTTP disponibili in IE 6 e 7. IE non mostra nulla fino a che i fogli di stile non sono tutti presenti in memoria: usando @import in questa maniera la pagina restera’ vuota per almeno 12 secondi. Usare LINK al posto di @import preserva l’ ordine impostato dallo sviluppatore come mostrato in Figura 8. In questo modo la pagina verra’ generata in 4 secondi.

LINK LINK

E’ piu’ semplice e sicuro utilizzare LINK per i nostri fogli di stile:

<link rel='stylesheet' type='text/css' href='a.css' >
<link rel='stylesheet' type='text/css' href='b.css' >

Usare LINK assicura che i fogli di stile verranno scaricati in parallelo in tutti i browser: l’ esempio LINK LINK lo dimostra (Figura 9). Usare LINK garantisce anche l’ ordine impostato dallo sviluppatore.

Figura 7. usiare link assicura il download parallelo in tutti i browser

Figura 9. Usare LINK assicura il download parallelo in tutti i browser

Questo problema e’ imputabile ad IE. E’ particolarmente noioso che i file vengano scaricati in un ordine differente. Tutti i browser dovrebbero avere un po’ di lungimiranza e dovrebbero implementare un sistema che guardi a tutti i file CSS, con particolare attenzione alle regole @import che possono essere usate. Fino a che io browser non si comporteranno in questa maniera, e’ consigliabile usare LINK ed evitare @import.

I tempi di scaricamento sono volutamente esagerati, per renderci conto meglio di quanto accade. Ma persone con connessioni lente potrebbero avere esperienze non molto diverse da quelle illustrate. Le conclusioni sono:

  • usare @import in un foglio di stile aumenta il tempo di download della pagina;
  • usare @import in IE causa il cambiamento dell’ ordine di download. Questo puo’ causare un aumento esponenziale dei tempi di visualizzazione della pagina.

Articolo originale don’t use @import scritto da Steve Souders, esperto in prestazioni pagine web presso Google Inc. Tradotto con il consenso dell’ autore, thank you so much Steve! http://www.stevesouders.com/blog/2009/04/09/dont-use-import/

Termini collegati: , I commenti ed i trackbacks sono attualmente chiusi.