7

Mi sto immergendo in strumenti per le prestazioni che vengono forniti con Google Chrome mentre sto cercando di capire come migliorare le tecniche di miglioramento delle prestazioni. Sto giocando con la scheda Timeline e l'ho trovato nella mia pagina evento First Paint prima dell'evento DOMContentLoaded. Ho letto alcuni articoli e, a quanto si dice, il primo momento in cui il browser può iniziare a mostrare materiale all'utente deve essere dopo DOMContentLoaded. Qualcuno potrebbe spiegare per favore è vero?Perché First Paint sta accadendo prima di DOMContentLoaded

risposta

4

DOMContentLoaded significa che il parser ha completato la conversione del HTML in nodi DOM ed eseguito qualsiasi script sincrone.

Ciò non impedisce al browser di visualizzare un albero DOM/CSSOM incompleto. In effetti, deve essere in grado di eseguire i reflows comunque nel caso in cui le query JavaScript abbiano le proprietà CSS calcolate. E se può fare i reflows su alberi incompleti, potrebbe anche renderli.

Questo è rilevante anche per i documenti di grandi dimensioni in streaming da un server. L'utente può già iniziare a leggerlo prima che abbia completato il caricamento.

È importante comprendere che l'intero processo di analisi/valutazione/rendering è una pipeline di elaborazione del flusso con alcune parti anche eseguite in parallelo/speculativamente. Le fasi successive della pipeline non attendono il completamento delle fasi precedenti, ma prendono le uscite non appena arrivano e le elaborano non appena sono disponibili informazioni sufficienti per effettuare l'incremento successivo.

E.g. il parser ovviamente non può emettere nodi Element prima di elaborare tutti i suoi attributi, ma può emettere il nodo mentre sta ancora elaborando il suo albero figlio. E il renderer può rendere il nodo senza i suoi figli. E può essere reso con gli stili incompleti solo per subire un reflow più tardi, ad es. quando javascript inserisce un altro foglio di stile o semplicemente perché i nodi figli che devono ancora essere inseriti influenzano il modo in cui sarà reso.

http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#The_main_flow

E 'importante capire che questo è un processo graduale. Per una migliore esperienza utente, il motore di rendering proverà a visualizzare i contenuti di sullo schermo il prima possibile. Non attenderà fino a quando tutto il codice HTML viene analizzato prima di iniziare a creare e a tracciare l'albero di rendering. Le parti del contenuto verranno analizzate e visualizzate, mentre il processo continua con il resto dei contenuti che continuano a provenire dalla rete .

0

Ottima domanda! come so che questo non è sempre il caso. Quello che il browser deve dipingere è l'albero di rendering e questo significa che ha bisogno di DOM e CSSOM, ma il punto è che ci sono ostacoli come il parser che blocca Java Script o il rendering che blocca CSS che può fermare questo processo. Ma la tua domanda riguarda specificamente DOMContentLoaded se leggi i passaggi definiti per user agent in http://www.w3.org/TR/html5/syntax.html#the-end e specialmente nel passaggio 4 vedrai che questo evento viene attivato ogni volta che non è rimasto uno script per l'esecuzione ma cosa succede se contrassegni lo script con defer o async di facendo questo prometti che lo script non eseguirà una query su CSSOM. Ecco la linea temporale che ho catturato dalla mia nota campione fittizia che ho contrassegnato come java script come posticipato: TimeLine Example in questo grafico puoi vedere che la prima vernice è prima di DCL! Questo è anche un buon articolo su l'analisi del percorso critico di rendering scritto da Ilya Grigorik

Problemi correlati