Memorizzazione di javascript specifici per pagina su un sito gestito da AJAX?

1

Ho una domanda generale sul posizionamento del codice javascript in un'applicazione Web basata su AJAX. In un precedente lavoro, tendevamo a gettare tutto in un unico file monolitico. Quando il mantenimento di quel file è diventato troppo difficile, lo abbiamo diviso in più file più piccoli e li abbiamo "incollati" insieme con un "loader" di php (praticamente solo un gruppo di istruzioni incluse)

Poiché tutte le mie pagine sono caricate dinamicamente tramite AJAX, non posso semplicemente avere file diversi chiamati separatamente per pagina.

L'ovvio svantaggio di questo metodo è che tutto il tuo javascript è caricato dall'utente finale, anche se non è richiesto per il caricamento della prima pagina. (Il che causa il problema, più pagine hai)

Per aggirare questo problema, ho iniziato a inserire javascript specifico della pagina nella pagina del modello stesso, in un tag <script> in basso, che funziona come previsto. È caricato solo il javascript che desidero.

Tuttavia, non sono sicuro che questa pratica sia tabù, o se ci sono strategie migliori per caricare il mio javascript. Ho la sensazione che mescolare il mio modello con il mio codice script sia una ricetta per il disastro ..

    
posta Julian H. Lam 14.10.2011 - 15:36
fonte

2 risposte

4

Risposta breve: un file monolitico con un'intestazione del futuro lontano scade.

Risposta lunga: dipende. Se sei Gmail e hai più di 1 megabyte di javascript nella tua applicazione, dovrai dividerlo per ridurre il carico e migliorare l'esperienza utente. Per il resto di noi, tuttavia, la soluzione migliore che ho trovato è quella di caricare la libreria principale (come jQuery) da un CDN di terze parti (come Google). Quindi dividi in due il tuo file monolitico: lib.js e app.js . Lib dovrebbe contenere librerie di terze parti e app il tuo codice specifico del sito. L'idea generale è che raramente aggiornerai le librerie o ne aggiungerai di nuove, in modo che raramente i file vengano invalidati e scaricati in cache dagli utenti.

Utilizza una tecnica come quella descritta in questo sito per spostare quasi tutti i tag in-page <script> senza un attributo src in un file esterno:

link

Quindi quello che dovresti lasciare sono i tag <script> con src , e gli unici in linea rimanenti dovrebbero essere perché devi passare i dati dal tuo codice backend a javascript (e vuoi evitare una richiesta AJAX su caricamento della pagina che bloccherà il rendering). Supponi che lo spazio dei nomi del mio progetto sia Foo , quindi il tag in linea sarà simile a:

<script type="text/javascript">
    Foo.Context = {{ js_context|safe }};
</script>

js_context è una variabile passata al mio modello dal mio backend ed è già un oggetto JSON. Le parentesi graffe e |safe sono solo dal motore di template front-end che ho usato (in questo caso, i modelli incorporati di Django). Ora il mio codice specifico della pagina, che vive in app.js , può guardare il contenuto di Foo.Context dopo che document.ready si attiva per qualsiasi variabile di cui ha bisogno evitando una richiesta AJAX iniziale.

Come al solito per i tuoi file statici, dovresti servirli con intestazioni future che scadono:

Cache-Control: public, max-age=31536000

Quando aggiorni i tuoi script, il tuo passo di costruzione dovrebbe rinominare il file concatenato e minimizzato o aggiungere un parametro di query GET alla fine del <script> src , in questo modo:

app.12345.js o app.js?v=12345

In questo modo gli utenti chiederanno il nuovo file, rompendo la cache. Come avvertenza, tieni presente che le versioni precedenti di alcuni proxy inversi (come Squid) non funzionano correttamente con i parametri GET su file statici, quindi l'ultima di queste due opzioni non funzionerebbe. Ma non mi sono mai imbattuto in questo problema, quindi la tua milizia potrebbe variare.

Quando raggiungi il livello Gmail delle dimensioni degli script, puoi iniziare a utilizzare una libreria come LABjs o RequireJS per caricare in modo dinamico solo i pezzi di app.js necessari per determinate pagine o funzionalità.

Ultimo ma non meno importante, spero che i tuoi tag <script> siano nella parte inferiore della pagina, proprio prima della chiusura di </body> . Ciò impedisce al browser di mostrare una pagina bianca vuota mentre gli script vengono scaricati, analizzati ed eseguiti. L'unica eccezione a questa regola sono le librerie che devono assolutamente essere nella funzione <head> , come Modernizr.

    
risposta data 14.10.2011 - 17:15
fonte
1

Esistono due principali tecniche di caricamento JavaScript.

Il grande file

Alcune persone dicono che la cache HTTP funziona in modo da inviare tutto quel javascript in un file gzip compresso minorato e dimenticarsi del resto. Il primo è costoso, il resto è economico

Le richieste HTTP piccole parallele

Altri dicono, ma puoi inviare più richieste HTTP in parallelo, quindi dovresti inviare molte piccole richieste HTTP asincrone usando una sorta di libreria del caricatore come require.js

Quello che usi è per te, personalmente uso un file monolitico e io uso un packager sensato (browserify)

    
risposta data 14.10.2011 - 15:43
fonte

Leggi altre domande sui tag