Il codice Jquery dovrebbe andare nell'intestazione o nel piè di pagina?


Risposte:


189

Tutti gli script devono essere caricati per ultimi

In quasi tutti i casi, è meglio posizionare tutti i riferimenti agli script alla fine della pagina, poco prima </body>.

Se non sei in grado di farlo a causa di problemi di templatura e quant'altro, decora i tag degli script con l' deferattributo in modo che il browser sappia scaricare gli script dopo aver scaricato l'HTML:

<script src="my.js" type="text/javascript" defer="defer"></script>

Custodie per bordi

Ci sono alcuni casi limite, tuttavia, in cui potresti riscontrare sfarfallio della pagina o altri artefatti durante il caricamento della pagina che di solito possono essere risolti semplicemente posizionando i riferimenti degli script jQuery nel <head>tag senza l' deferattributo. Questi casi includono l'interfaccia utente di jQuery e altri componenti aggiuntivi come jCarousel o Treeview che modificano il DOM come parte della loro funzionalità.


Ulteriori avvertenze

Ci sono alcune librerie che devono essere caricate prima del DOM o CSS, come i polyfill. Modernizr è una di queste librerie che deve essere inserita nel tag head .


5
Bene, considera questo: themeforest.net/item/portfolious-professional-business-template/… . È un tema del sito che ho acquistato di recente e che presenta sulla sua homepage l'uso di jQuery con jCarousel. Quando ho spostato i blocchi di script dalla testa alla fine del file ho notato che le immagini utilizzate nella giostra sarebbero state mostrate tutte in una volta durante il caricamento della pagina, mentre quando i file di script erano nella testa la pagina si sarebbe caricata in modo più fluido.
Chad Levy,

5
Usa CSS per impostare lo stato iniziale del contenuto. CSS dovrebbe andare in testa. Rompere qualcosa per far funzionare qualcos'altro non è la soluzione. Se un visitatore deve attendere il caricamento di jQuery e del caricamento di tutti i plug-in associati prima del rendering di qualsiasi contenuto, potrebbe non rimanere abbastanza a lungo per visualizzarlo.
Duncan,

9
ChadLevy ha ragione: ci sono alcune condizioni in cui i plugin jQuery funzionano meglio se sono citati in <head>. Se il markup dipende dal plug-in jQuery che ordina i contenuti per te, non ha senso inserire il riferimento del plug-in nella parte inferiore della pagina, poiché otterrai un markup funky nella tua pagina web fino a quando i plug-in non vengono caricati. Le regole devono essere seguite fino a quando non funzionano più, a quel punto le regole dovrebbero essere infrante.
Robert Harvey,

2
@Duncan: idealmente questo sarebbe il caso in cui è possibile controllare tutte le dipendenze. La cosa su jQuery (in particolare cose come l'interfaccia utente di jQuery e altri componenti aggiuntivi) è che per progettazione non si può avere il controllo completo sulla loro funzionalità, quindi aggiungere qualcosa come gli attributi di visibilità a un elemento DOM in modo che carichi più graziosamente potrebbe non essere possibile se un addon che utilizza quell'elemento non terrà conto di tale attributo. A volte è meglio sfidare una convenzione semplice piuttosto che cercare di ottenere una dipendenza per funzionare nel modo desiderato.
Chad Levy,

2
@Stefan: se i tuoi plugin jQuery non sono autorizzati a manipolare il DOM, qual è il punto?
Robert Harvey,

229

Metti gli script in fondo

Il problema causato dagli script è che bloccano i download paralleli. La specifica HTTP / 1.1 suggerisce che i browser non scaricano più di due componenti in parallelo per nome host. Se offri le tue immagini da più nomi host, puoi ottenere più di due download in parallelo. Durante il download di uno script, tuttavia, il browser non avvierà altri download, anche su nomi host diversi. In alcune situazioni non è facile spostare gli script in basso. Se, ad esempio, lo script utilizza document.write per inserire parte del contenuto della pagina, non può essere spostato in basso nella pagina. Potrebbero esserci anche problemi di scoping. In molti casi, ci sono modi per aggirare queste situazioni.

Un suggerimento alternativo che spesso emerge è l'uso di script differiti. L'attributo DEFER indica che lo script non contiene document.write ed è un indizio per i browser che possono continuare a eseguire il rendering. Sfortunatamente, Firefox non supporta l'attributo DEFER. In Internet Explorer, lo script può essere rinviato, ma non quanto desiderato. Se uno script può essere rinviato, può anche essere spostato nella parte inferiore della pagina. Ciò renderà le tue pagine web più veloci.

EDIT: Firefox supporta l'attributo DEFER dalla versione 3.6.

fonti:


4
Ho visto alcuni consigli moderni secondo cui gli script dovrebbero essere collocati in alto. Posizionando gli script in basso, è possibile caricare in parallelo le immagini e gli altri contenuti nel corpo della pagina, ma in modo efficace gli script nella pagina verranno caricati in un secondo momento - l'intero corpo HTML deve essere scaricato prima che il browser sia a conoscenza gli URL degli script da caricare. La maggior parte delle persone fa riferimento alla guida di Yahoo, che non è più accurata: Firefox onora gli attributi differiti sugli script. Il differimento in alto comporterà un caricamento più veloce della pagina se lo si misura.
ShadowChaser,

Posso vedere alcune statistiche sulla velocità di caricamento della pagina con questo metodo?
Gabriel Alack,

1
Firefox supporta l'attributo DEFER dalla versione 3.6. Fonte: w3schools.com/tags/att_script_defer.asp
Nikita

1
Aggiornamento: da inizio / metà 2016, tutti i browser moderni hanno aumentato il numero di connessioni per nome host di almeno 6.
Night Owl

32

Caricare jQuery solo nella testa, ovviamente tramite CDN.

Perché? In alcuni scenari è possibile includere un modello parziale (ad es. Frammento di modulo di accesso ajax) con codice dipendente da jQuery incorporato; se jQuery viene caricato in fondo alla pagina, viene visualizzato l'errore "$ non definito", bello.

Esistono modi per ovviare a questo naturalmente (come non incorporare alcun JS e aggiungere un bundle js con caricamento in basso), ma perché perdere la libertà di js caricati pigramente, di poter posizionare il codice dipendente da jQuery ovunque tu voglia ? Al motore Javascript non importa dove risiede il codice nel DOM fintanto che le dipendenze (come il caricamento di jQuery) sono soddisfatte.

Per i tuoi file js comuni / condivisi, sì, inseriscili prima </body>, ma per le eccezioni, dove ha davvero senso la manutenzione delle applicazioni per attaccare uno snippet dipendente da jQuery o un riferimento di file proprio lì a quel punto nell'html, fallo.

Non ci sono colpi di performance caricando jquery in testa; quale browser del pianeta non ha già il file jNery CDN nella cache?

Molto rumore per nulla, metti jQuery in testa e lascia regnare la tua libertà.


1
molti, molti browser no; circa il 2% è la cifra più alta che ho letto, quando si prende in considerazione la versione e il fatto che la memorizzazione nella cache si basi su nomi esatti di risorse, quindi jquery1.4.2 non è lo stesso di jquery1.7 o 1.9.1 o .. .
Toni Leigh

Di quelli 2%, diciamo, metà se ne andrà prima che la pagina venga caricata per la prima volta. In questo modo stai perdendo 1%i visitatori, ma potenzialmente risparmiando un sacco di tempo e problemi di sviluppo. Vedi se questo ha senso con il tuo modello di business ...
osa,

13

Nimbuz fornisce un'ottima spiegazione del problema in questione, ma penso che la risposta finale dipenda dalla tua pagina: cosa c'è di più importante che l'utente abbia prima: script o immagini?

Ci sono alcune pagine che non hanno senso senza le immagini, ma hanno solo script minori, non essenziali. In tal caso ha senso mettere gli script in fondo, in modo che l'utente possa vedere le immagini prima e iniziare a dare un senso alla pagina. Altre pagine si basano sullo script per funzionare. In tal caso è meglio avere una pagina di lavoro senza immagini rispetto a una pagina di non lavoro con immagini, quindi ha senso mettere gli script in alto.

Un'altra cosa da considerare è che gli script sono generalmente più piccoli delle immagini. Naturalmente, questa è una generalizzazione e devi vedere se si applica alla tua pagina. Se lo fa allora, per me, è un argomento per metterli al primo posto come regola empirica (cioè, a meno che non ci sia una buona ragione per fare diversamente), perché non ritarderanno le immagini tanto quanto le immagini ritarderebbero gli script. Infine, è molto più semplice avere uno script in alto, perché non devi preoccuparti se sono ancora caricati quando devi usarli.

In sintesi, tendo a mettere gli script in alto per impostazione predefinita e considero solo se vale la pena spostarli in fondo al termine della pagina. È un'ottimizzazione - e non voglio farlo prematuramente.


Mi hai avuto fino a quando non hai trascinato fuori l'argomento dell'ottimizzazione prematura. Questa è solo un'altra regola che le persone seguono dogmaticamente senza comprenderne appieno le implicazioni.
Robert Harvey,

6
Oh bene, non posso vincerli tutti! Sono convinto di comprenderne le implicazioni. :)
EMP,

Non sono sicuro che devi preoccuparti se i tuoi script sono stati caricati. Rendering dei blocchi fino a quando non viene caricato uno script, che è la parte principale di questa discussione. Quindi finché non chiami nulla prima di caricarlo, stai bene. Inoltre, questo è ciò che serve per i callback e non dovresti davvero incorporare molto altro nella tua pagina. A quanto ho capito, le immagini non si bloccano (si caricano in parallelo) e infatti il ​​DOM può essere pronto e gli script in esecuzione prima che le immagini siano completamente caricate. Non ha senso mettere prima gli script solo per evitare che vengano bloccati.
Duncan,

4
Dato che il consenso generale è quello di mettere gli script in fondo, non sarebbe meglio farlo per impostazione predefinita e spostarli in alto solo se si verificano problemi? Sembra strano fare le cose all'indietro. A volte è meglio fare la cosa ottimale se non c'è differenza nello sforzo compiuto :)
Duncan,

@Duncan, Sì, quello era il mio approccio. Ho messo i plugin in basso, e quando ho avuto dei problemi, li ho messi in cima e questo ha risolto i problemi.
Robert Harvey,

6

La maggior parte del codice jquery viene eseguita sul documento pronto, che non avviene comunque fino alla fine della pagina. Inoltre, il rendering della pagina può essere ritardato dall'analisi / esecuzione di javascript, quindi è consigliabile mettere tutto javascript in fondo alla pagina.


5

La pratica standard è mettere tutti i tuoi script in fondo alla pagina, ma uso ASP.NET MVC con un numero di plugin jQuery e trovo che tutto funzioni meglio se inserisco i miei script jQuery nella <head>sezione del master pagina.

Nel mio caso, ci sono artefatti che si verificano quando la pagina viene caricata, se gli script si trovano nella parte inferiore della pagina. Sto usando il plug-in jQuery TreeView e se gli script non vengono caricati all'inizio, l'albero verrà visualizzato senza le classi CSS necessarie imposte dal plug-in. Quindi ottieni questo casino dall'aspetto divertente quando la pagina viene caricata per la prima volta, seguita dal rendering corretto di TreeView. Molto male. Mettere i plugin jQuery nella <head>sezione della pagina principale elimina questo problema.


Le intranet non sono soggette alle stesse condizioni di Internet, quindi il ritardo di caricamento è probabilmente meno percepibile. È comunque consigliabile seguire le regole.
Duncan,

no, inserendo gli identificatori / stili CSS nel markup (invece di aspettare che jQuery lo faccia su DOM pronto) risolve il problema.
Dan Beam,

1
@Dan Beam: Treeview è popolato da una tabella di database e gli stili di Treeview sono impostati dal plug-in Treeview in base al contenuto della tabella, quindi no, non funzionerà.
Robert Harvey,

1
Perché dovrei farlo quando posso solo mettere lo script del plugin Treeview non modificato nella parte superiore della pagina e funzionerà bene? Non ha alcun senso, Dan.
Robert Harvey,

1
Saluti Robert, sto anche usando ASP.NETMVC con forme in parziali. Ha senso mantenere il javascript all'interno del parziale poiché i nuovi campi vengono riassegnati alla loro funzionalità ogni volta che il parziale viene eseguito (diciamo per la validazione). Ho affrontato problemi con questo solo quando ho tentato di usare @Html.Action, che scrive dinamicamente un risultato sull'output, poiché il mio parziale dà $ is undefinedsignificato, invece devo usare .load ('@ Url.Action') per caricare il parziale. Ma questo dà una spinta a causa della richiesta extra. Sulla base del tuo contributo, sposterò jquery sopra RenderBody () nella mia pagina principale
Malkin,

4

Sebbene quasi tutti i siti Web collochino ancora Jquery e altri javascript nell'intestazione: D, controlla anche stackoverflow.com.

Ti suggerisco anche di indossare prima dell'etichetta del corpo. Puoi controllare il tempo di caricamento dopo averlo posizionato in entrambi i luoghi. Il tag script mette in pausa la pagina Web per caricarla ulteriormente.

e dopo aver inserito javascript a piè di pagina, potresti ottenere un aspetto insolito della tua pagina web fino a quando non carica javascript, quindi posiziona css nella sezione dell'intestazione.


2
Ma potresti ottenere la stessa cosa usando il differimento sullo script. w3schools.com/tags/att_script_defer.asp
Jack Tuck

2

Poco prima </body>è il posto migliore in base alle Yahoo Developer Network 's Best Practices per velocizzare il tuo sito Web questo link , ha senso.

La cosa migliore da fare è testare da soli.


0

Per me jQuery è un po 'speciale. Forse un'eccezione alla norma. Ci sono così tanti altri script che si basano su di esso, quindi è abbastanza importante che si carichi presto, quindi gli altri script che verranno dopo funzioneranno come previsto. Come ha sottolineato qualcun altro, anche questa pagina carica jQuery nella sezione head.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.