2016-04-28 20 views
5

Il javascript di Google Maps esegue alcune pesanti manipolazioni del DOM. Anche così, the fine docs suggeriscono di caricarlo con il flag defer:Perché utilizzare il differimento con Google Maps Javascript?

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script> 

Perché sarebbe stato suggerito la bandiera defer per uno script che esegue le manipolazioni DOM? Chiedo di sapere sia sul flag defer sia per informazioni sull'API di Google Maps poiché mi sembra di avere un malinteso su ciò che sta facendo uno di loro.

risposta

12

Normalmente, un tag script indica al browser di interrompere l'analisi dell'HTML, recuperare lo script, eseguirlo e solo successivamente continuare l'analisi dell'HTML. Questo perché il codice dello script può utilizzare document.write per l'output nel flusso di token HTML.

async and defer sono entrambi meccanismi per indicare al browser che è possibile procedere e continuare l'analisi dell'HTML in parallelo con il download del file di script e per eseguire il file di script in un secondo momento, non immediatamente.

Sono leggermente diversi, però; questo diagramma da the script section della versione WHAT-WG delle specifiche HTML è utile per immaginare le differenze:

enter image description here

Tutti i dettagli nelle specifiche linkato sopra, ma in breve, per gli script "classici" (il tipo siete abituati a, ma gli script dei moduli sono in arrivo):

  • Sia async e defer consentire al parsing del codice HTML per continuare senza attendere lo script per scaricare!.
  • defer farà attendere il browser per eseguire lo script fino al completamento dell'analisi.
  • async fa in modo che il browser attenda fino al completamento del download dello script, il che significa che può eseguire lo script prima che l'analisi sia completa o successiva, a seconda del termine del download (e ricorda che potrebbe provenire dalla cache).
  • Se async è presente e supportato dal browser, ha la precedenza su defer.
  • async Gli script possono essere eseguiti in qualsiasi ordine, indipendentemente dall'ordine in cui appaiono nel codice HTML.
  • defer Gli script verranno eseguiti nell'ordine in cui appaiono nell'HTML, una volta completata l'analisi.
  • async e defer sono ben supportati anche nei browser semi-moderni, ma non sono supportati correttamente in IE9 e versioni precedenti, vedere here e here.

Perché la bandiera defer essere suggerito per uno script che esegue le manipolazioni DOM?

due motivi:

  1. permette al parsing di continuare mentre lo script è stato scaricato, e
  2. Significa lo script non viene eseguito fino a quando l'analisi è completa.

Se non è stato utilizzato defer e hai effettuato le tue script tag non in modo ottimale, utilizzando defer aiuta lo script API si comportano correttamente lasciando la finitura del browser costruire il DOM prima che lo script cerca di manipolarlo.

Un sacco di gente ancora messo script tag nella sezione head del documento, anche se questo è di solito il posto peggiore per metterli a meno che non si utilizzadefer (o async). Nella maggior parte dei casi, il posto migliore (a meno che non si abbia un motivo per fare qualcos'altro) si trova esattamente allo fine, appena prima del tag di chiusura </body>, in modo che A) il tuo sito venga visualizzato rapidamente, senza attendere gli script; e B) Il DOM è completamente costruito prima di provare a manipolarlo. Raccomandare il defer potrebbe salvarli dal fastidio delle persone che inseriscono i tag script troppo presto nell'HTML.

+0

Penso che vedo. Quindi sembra che [l'articolo] (http://www.sitepoint.com/non-blocking-async-defer/) che ho letto per capire gli attributi di posticipo e asincrono sia ** completamente sbagliato **, e anche ** contraddice le specifiche **. Peccato che sia così [altamente su Google] (https://google.com/?q=javascript+defer+async). – dotancohen

+0

@dotancohen: No, è corretto, è solo un po 'vago quando dice "... non contiene document.write o modestia di modifica DOM:". Quello che * dovrebbe * dire è qualcosa del tipo "... non contiene alcuna modifica document.write o DOM intesa per essere eseguita in linea con il parser." (dal momento che ci sono altre cose che puoi fare, non solo 'document.write', che farebbe affidamento sul fatto che il parser sia trattenuto in attesa dell'esecuzione dello script).Non avrebbe dovuto dare l'impressione ** tutte le ** modifiche del DOM erano fuori dal tavolo. –

2

Gli esempi di google maps utilizzano entrambi i flag async e defer.

  • Il async bandiera permette lo script per caricare in parallelo al DOM analisi, e di eseguire non appena l'API è pronto.
  • Il flag defer consente di caricare lo script parallelamente all'analisi DOM , ma garantisce che lo script non verrà eseguito fino a quando il DOM non ha terminato l'analisi.

async è supportato dai moderni browser HTML5, mentre il supporto defer è universale. Quando i tag vengono utilizzati insieme, defer è solo un fallback per i browser meno recenti e verrà ignorato se async è supportato.

In questi semplici esempi, sia async o defer funzionerà, anche se non sono necessari. In questo caso è solo per le prestazioni.

Refs:
Speed up Google Maps(and everything else) with async & defer
async vs defer attributes - Growing with the Web