Caricamento javascript principale su ogni pagina? O suddividerlo in pagine pertinenti?


13

Ho un 700kbfile JS decompresso che viene caricato su ogni pagina. Prima avevo 12file javascript su ogni pagina ma per ridurre le richieste http li ho compressi tutti 1 file.

Questo file è ~130kb gzippeded è pubblicato gzip. Tuttavia sul computer locale è ancora decompresso e caricato su ogni pagina. È un problema di prestazioni?

Ho profilato javascript con il profiler di firebug ma non ho riscontrato alcun problema. Il problema / illusione che sto affrontando è che ci sono librerie jquery compresse in quel file che a volte non vengono utilizzate nella pagina corrente.

Ad esempio, jquery datatablesè compresso a 200kb e viene caricato solo su 2 pagine del mio sito Web. Un altro è jqplote questo è un altro 200kb.

Ora ho 400kbun codice in eccesso che non viene eseguito sulle 80%pagine.

Devo lasciare tutto in 1 file?

Devo estrarre le librerie jquery e caricare solo JS rilevanti nella pagina corrente?


Se hai 700kb di codice JS, dovresti davvero dividerlo e includere solo gli script di cui hai veramente bisogno. Inoltre, usando jQuery ("... scrivi di meno, fai di più ...") sembra un po 'troppo grande avere un file JS così grande. Che diamine stai facendo con una tale massa di JS?
feeela,

@feeela dai un'occhiata a jquery-ui, jquery.datatables. Quelli da soli sono 400kb insieme. Ho anche altri plugin che uso come jquery.validate, jquery.uniform - questa roba si aggiunge. xD
Kyle il

In tal caso - come detto sotto - dovresti davvero dividere gli script e caricare solo ciò che è necessario ...
feeela

Risposte:


6

Puoi usare requestjs per caricare dinamicamente le librerie che ti servono solo su quelle pagine. Quindi devi solo caricare il requestjs (che è di circa 14k) su tutte le pagine, risparmiando circa 385kb.

Anche l'integrazione è molto semplice: basta "racchiudere" il codice che hai con le cose include include:

require(["jquery", "jquery.alpha", "jquery.beta"], function($) {
    //the jquery.alpha.js and jquery.beta.js plugins have been loaded.
    $(function() {
        $('body').alpha().beta();
    });
})

1
Mi piace molto il design del sito web. Non ho mai sentito parlare di requestjs. Come valuti questo rispetto alle richieste http? Questo non mette più richieste http sulla pagina? (non è poi così male?) Scusa per le mie domande stupide.
Kyle,

Avere meno richieste è ovviamente meglio, ma anche salvare> 350k non è male. Sì, il tuo sito presenterà un'altra richiesta se includi un'altra libreria in quella pagina. Se è datatablessu un sito e jqplotsu un altro, va bene. Caricare altre cinque librerie sul 50% delle pagine farebbe sparire il vantaggio, sono d'accordo. Ma nel tuo caso, lo considero un'ottima soluzione (supponendo che il resto di voi js rimanga un file compresso).
Michael,

Grazie Michael. Questa soluzione è piuttosto geniale. Prima stavo per dividere tutto in una pagina ma questo ... Questo è meglio di quello che avevo in mente. Grazie per questo suggerimento Dal momento che hai familiarità con requisjs, pensi che requis sarebbe sufficiente? Vedo su alcuni siti web che utilizzano Google per caricare il loro jQuery e altre librerie, google.load('...').
Kyle,

1
Consiglio vivamente di caricare librerie comuni da Google (o altri siti che offrono). Questo ha 2 vantaggi: a) il file lib viene memorizzato nella cache tra siti diversi. È probabile che l'utente abbia già visitato un sito, che utilizza anche jquery caricato da Google. Questo file viene quindi caricato dalla cache, non di nuovo dal server! b) Anche se deve essere caricato, sarà molto più veloce caricarlo da Google CDN, che dal tuo server web.
Michael,

8

Se il tuo framework / CMS / qualunque cosa abbia le funzioni appropriate, puoi includere lo script in modo condizionale come suggerisce @Michael, ma senza la libreria aggiuntiva.

Prendendo la custodia dei tuoi database, ad esempio, WordPress potrebbe gestire la situazione tramite qualcosa di simile:

// For reference; this isn't functional code.
if (is_page('whatever')) {
    <script src="/path/to/datatables.js"><script>
    <script>
        [Your datatables setup here]
    </script>
}

Non c'è niente di sbagliato in RequireJS; devi solo valutare se il livello aggiuntivo di complessità che aggiunge (oltre a imparare a usarlo in primo luogo) compensa ciò che gli strumenti più prontamente disponibili possono fare per te. Se hai solo i due casi che hai menzionato sopra, questa potrebbe essere un'opzione migliore. Se hai ancora molto da fare, RequireJS potrebbe essere un approccio migliore nel complesso.


Ho un sito web personalizzato che ho creato da un modello html che ho comprato dalla foresta tematica. L'unico problema è che il tipo aveva come 6 file JS sparsi ed era disordinato. Quindi li metto in un unico file e questo include alcune librerie jqplot, datatables, jquery-ui. Tutti quanti si sommano a circa 550-600 kb. 100kb è il mio JS che usa quelle librerie. Sento che dovrei risolvere questo problema invece di caricare così tante librerie JS irrilevanti su ogni pagina. Grazie per il tuo suggerimento! =)
Kyle il

5

700kb di JavaScript sono un problema di prestazioni, perché devono essere analizzati dopo il caricamento della pagina. Per questo motivo, dovresti aver cura di caricare solo gli script necessari. Un grande JavaScript potrebbe essere OK su siti AJAX completi, come GMail, quando la navigazione viene gestita internamente senza uscire dalla singola pagina. Tuttavia, anche i siti AJAX completi eseguono il caricamento JS dinamico per impedire il caricamento di JS non necessari all'avvio (problemi di memoria e velocità).

Hai detto che volevi ridurre il traffico http. Dovresti giocare con la cache HTTP . Il problema è che le modifiche a JS potrebbero non essere visibili fino alla scadenza della cache, se si imposta un tempo di scadenza troppo elevato.

C'è un trucco, tuttavia, a cui non ti riferisci myscript.js, ma myscript.js?version={myversion}. Dopo l'aggiornamento dell'applicazione, si modifica {myversion}e si forza il caricamento di JavaScript.


Sì, con queste dimensioni di JS, insieme al fatto che sono per lo più librerie abbastanza comuni, l'uso di una CDN sarà un grande vantaggio.
Zhaph - Ben Duguid,

1

~ 700kb di JavaScript sono un problema di prestazioni e se compressi e dobbiamo vedere le regole da seguire mentre ci si occupa di ottimizzare il codice sono:

  1. Minimizza Javascripts - Semplicemente stai comprimendo e decomprimendo, il che non ha ridotto il codice, Innanzitutto usa il buon strumento Minify JS e Minimizza il tuo codice. Sono 12 file e ogni file dovrebbe essere Minify separatamente prima di clubbing per le migliori prestazioni.

  2. Usa il caricamento javascript asincrono , usando il caricamento asincrono si ottengono tempi di caricamento e rendering della pagina molto rapidi. L'impatto dell'utente è molto forte perché un buon caricamento asincrono non bloccherà il processo di rendering e il tempo di caricamento della pagina percepito è fortemente ridotto. Le immagini e gli altri elementi visualizzati regolarmente verranno visualizzati come se non fosse caricato javascript.

  3. Usa GOOGLE cdn per JQUERY ; Penso che tu stia usando JQUERY e lo stia caricando dal tuo sito web, che è anche un ulteriore svantaggio, usa gentilmente il CDN GOOGLE (gratuito) per caricare JQUERY. Poiché viene utilizzato da quasi ogni terzo sito Web e quindi già disponibile sul computer client nella cache.

  4. Intestazioni di scadenza lunghe personalizzate : in alcuni casi il modo in cui il sito Web viene caricato con problemi di tempo di caricamento, quindi è necessario fornire le scadenze lunghe per i file JS HTTP, in modo che non possano essere scaricati ogni volta, il che ridurrà la richiesta per la seconda volta. Secondo la mia ricerca, il tempo di caricamento impiegato nella seconda pagina ha più uscite rispetto alla prima visita della pagina.

  5. Verifica con la velocità della pagina : alcune volte altre risorse influiscono anche sulla velocità di caricamento della pagina di controllo incrociato e cercano anche di ottimizzare altre risorse. Come fare un po 'di passo su ogni risorsa dare un tempo extra al nostro caricamento JS.

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.