Strumenti di sviluppo di Chrome JavaScript e prestazioni

In questa terza parte della nostra serie di strumenti per sviluppatori di Chrome, esamineremo come modificare e eseguire il debug di JavaScript. L'ottimizzazione è una parte importante del processo di sviluppo, in particolare per le applicazioni critiche per le prestazioni. Discuteremo anche delle tecniche per identificare potenziali colli di bottiglia nel nostro codice.

Come nei precedenti due articoli, mi concentrerò sulle funzionalità disponibili nel build di Chrome Canary (versione 26.0, al momento in cui scrivo). Tratterò i pannelli Fonti e Timeline.


Pannello delle fonti

Il pannello Sources è il luogo go-to per il debug di JavaScript. Questo pannello, abbinato al pannello della console, è uno strumento estremamente potente! È un'interfaccia point-and-click che consente di mettere in pausa l'esecuzione di JavaScript e di ispezionare tutte le variabili e gli oggetti nell'ambito corrente.

  1. Il pannello Fonti. Se non vedi tutti gli script che ti aspetti, aggiorna la pagina con il pannello Sorgenti aperto.
  2. Questo riquadro può essere o nascosto, nascosta automaticamente o fisso. Fare clic sulla piccola icona a destra di "Script contenuto" per alternare tra questi stati. Questo riquadro può essere ridimensionato.
  3. La scheda Fonti all'interno del riquadro a sinistra; probabilmente avrai questa scheda aperta la maggior parte del tempo. Le risorse che elenca sono separate da sottodomini e puoi aspettarti di vedere CSS, JavaScript e HTML all'interno della scheda.
  4. Potresti trovare utile modificare i tuoi CSS e JavaScript negli Strumenti per sviluppatori.

  5. La scheda Script contenuto (non attiva nello screenshot) potrebbe inizialmente visualizzare molti script con un nome strano. Queste sono infatti le estensioni di Chrome che sono state caricate sulla pagina. Questo è utile per il debug delle estensioni effettive. Altrimenti, puoi evitare di vederli aprendo la tua pagina in una finestra di navigazione in incognito; la maggior parte delle estensioni sono disabilitate per impostazione predefinita in modalità in incognito.
  6. Il riquadro del contenuto principale mostra il contenuto dello script selezionato. La selezione di più script crea un'interfaccia a schede simile a un IDE.
  7. Questo pannello contiene pannelli secondari che forniscono utili utilità di debug JavaScript. Nella parte superiore del pannello ci sono le icone per scorrere il codice.
  8. Guarda le espressioni fa esattamente questo, le espressioni 'orologi' che hai digitato. Se ti senti di voler sapere il valore del Questo parola chiave nelle varie fasi di un programma JavaScript, è possibile orologio il Questo parola chiave per vedere i suoi diversi valori nel tempo. Fai clic sul pulsante Aggiungi per aggiungere un'espressione e, se un'espressione non si aggiorna, fai clic sul piccolo pulsante di aggiornamento accanto al pulsante Aggiungi.
  9. XHR Breakpoints ci consente di interrompere l'esecuzione del codice JavaScript quando si effettua una richiesta Ajax. Otteniamo ancora più controllo su questo comportamento fornendo un valore nel campo "Interrompi quando l'URL contiene", che si apre quando si preme il pulsante Aggiungi. Se non fornisce alcun valore, il debugger si interrompe qualsiasi XHR richiesta.
  10. I breakpoint Listener eventi consentono di impostare punti di interruzione per eventi specifici. Lo screenshot elenca solo le categorie di livello superiore. Ad esempio, "Timer" ha i seguenti punti di interruzione del listener di singoli eventi: "Imposta timer", "Cancella timer" e "Timer attivato".
  11. Se si incontra un codice minisito, selezionando 'Pretty Print' si comporta come un beautifier JavaScript.

Tab Fonti

La scheda delle fonti elenca le risorse raggruppate in base al sottodominio da cui sono servite. Ogni risorsa ha un menu contestuale (rivelato facendo clic con il tasto destro del mouse sulla risorsa) con una serie di opzioni comuni. Un'opzione, tuttavia, è molto interessante: Modifiche locali, che vedremo più avanti.

Nota: è possibile visualizzare l'elenco dei file di origine come un elenco semplice (ovvero non contenuto nelle cartelle raggruppate per sottodominio) deselezionando 'Mostra cartelle' in Impostazioni> Generale.

Cliccando su una risorsa lo si visualizza nel riquadro del contenuto principale. Non dimenticare di abilitare la modalità di stampa per risorse minime, poiché alcuni minificatori rinominano le variabili per rendere il codice più difficile da capire. Si spera che più sviluppatori genereranno mappe di origine in futuro, rendendo più semplice lavorare con codice miniato.

È possibile modificare la maggior parte dei file nel riquadro del contenuto principale e tali modifiche si riflettono immediatamente nel browser. Dopo aver apportato modifiche a una risorsa, il menu di scelta rapida offre la possibilità di salvare (anche se non in modo permanente) o Salva con nome (salva una nuova versione localmente). Quando lavori con i tuoi siti locali, potresti trovare utile modificare i tuoi CSS e JavaScript negli Strumenti per sviluppatori invece del tuo IDE. Salvando le modifiche, in questo caso, modifica il vero file sorgente. Strumenti come Tincr o chrome-devtools-autosave possono aiutare con l'automazione di questo flusso di lavoro.

Il menu di scelta rapida della risorsa offre anche la possibilità di rivelare la risorsa nel pannello di rete.

revisioni

Una revisione è un nuovo punto all'interno della vita di una risorsa, su cui è stato modificato. La modifica e il salvataggio del codice dal pannello delle fonti crea una nuova revisione e le modifiche di stile apportate all'interno del pannello Elementi attivano effettivamente una nuova revisione!

Dopo aver apportato alcune modifiche, è possibile fare clic con il tasto destro del mouse sulla risorsa e selezionare Modifiche locali. Questo apre un nuovo riquadro di Modifiche locali che contiene un diff dei file originali e modificati. All'interno del riquadro delle modifiche locali, possiamo ripristinare un file sorgente modificato nella sua interezza (utile per quando hai apportato un gran numero di modifiche indesiderate) facendo clic su "ripristina" accanto al nome file.

Riquadro del contenuto principale

Gli Strumenti per sviluppatori sono abbastanza gentili da avvisarci di potenziali ottimizzazioni.

Il riquadro del contenuto principale presenta molte delle funzionalità che potresti trovare negli editor di codice di base: numeri di linea, evidenziazione della sintassi, possibilità di creare schede e funzionalità di 'annullamento'. Anche se non corrisponde a un IDE completo, non è male per il montaggio veloce.

I punti di interruzione

I punti di interruzione ci consentono di interrompere l'esecuzione del codice JavaScript e di ispezionare l'ambiente corrente. Ad esempio: supponiamo di avere un semplice per loop che spinge gli oggetti su un array. Il nostro obiettivo è comprendere con precisione i meccanismi interni all'interno di ogni iterazione del ciclo. Potremmo usare molto facilmente console.log per registrare le variabili che vogliamo ispezionare. Mentre questa tecnica ti darebbe i risultati desiderati, non è certamente la tecnica di debug più efficace. Utilizzando i punti di interruzione, possiamo sospendere l'esecuzione del codice mentre ci si trova all'interno di per loop e ispezionare tutte le variabili nell'ambito del contesto.

var arr = []; per (var i = 0; i < 3; i++)  var num = i; arr.push(num); 

Per aggiungere un punto di interruzione, fare clic sul numero di riga; puoi anche fare clic con il pulsante destro del mouse sul numero di riga e scegliere l'opzione "Aggiungi punto di interruzione". Dopo aver impostato il punto di interruzione, aggiornare la pagina e notare che i punti di interruzione persistono tra i carichi di pagina. Se il codice deve ancora essere eseguito (ad esempio, il punto di interruzione è stato impostato all'interno di un gestore di eventi click), quindi è possibile avviare l'esecuzione del codice senza un aggiornamento della pagina.

È possibile codificare un punto di interruzione nel codice utilizzando il comando debugger; dichiarazione nel tuo codice. Gli Strumenti per sviluppatori (e la maggior parte dei debugger JavaScript) riconoscono questo come un punto di interruzione.

Quando si raggiunge un punto di interruzione, la pagina si colora di grigio e la linea del codice si evidenzia in blu. A questo punto, possiamo premere il tasto Esc per visualizzare il pannello della console. Ciò che è interessante è che il codice scritto ed eseguito all'interno della console (mentre è in pausa su un breakpoint) viene effettivamente eseguito nel contesto correntemente in pausa! In genere, il Questo parola chiave si riferisce al globale finestra oggetto; considerando la visione Questo in un clic gestore di eventi mostra il valore come destinazione dell'evento (un elemento).

Nello screenshot in alto, la parte grigia è il documento stesso e gli Strumenti per gli sviluppatori hanno evidenziato la riga corrente di JavaScript. Nella console, si vedono i risultati dell'ispezione di alcune variabili. A destra del riquadro del contenuto è presente il riquadro "Variabili dell'ambito", in cui è possibile esaminare tutte le variabili e gli oggetti nell'ambito corrente.

Breakpoint condizionali

I punti di interruzione condizionali consentono di interrompere quando una determinata condizione è vera.

Nel pannello laterale destro del pannello Sorgenti, noterai la scheda Breakpoint XHR. Fai clic su "Aggiungi XHR Breakpoint" sul tuo sito preferito autorizzato da Ajax. Lasciando vuoto il campo 'URL Contiene' si interrompe qualsiasi XHR richiesta.

Questo presenta agli sviluppatori nuove e potenti opportunità. Possiamo navigare verso un sito che non abbiamo costruito, né con alcun coinvolgimento, e semplicemente avviare il debug del codice in base a determinati eventi e criteri. Quindi fare una pausa sulle richieste Ajax è bello, ma su quali altri eventi possiamo andare avanti?

Punti di interruzione del listener di eventi

Il pannello delle fonti ha un'interfaccia point-and-click per l'impostazione dei breakpoint che corrispondono a determinati listener di eventi. Nota che interrompere un evento particolare funziona solo quando la pagina in questione è in ascolto per quell'evento. Se rompiamo il Controllo> Ridimensiona evento, avendo un codice come il seguente assicura che il codice si interrompa quando l'evento si attiva:

window.onresize = function (e) console.log (e); ;

Quindi, quando si tratta di eventi particolari utili?

I punti di interruzione persistono tra i carichi di pagina.

  • Quando giochi a questo nuovo gioco HTML5 e vuoi sapere cosa sta succedendo nel suo ciclo di gioco principale. Prova a impostare il Richiedi frame di animazione e Timer ascoltatori di eventi e scopri cosa succede in ogni evento.
  • Quel nuovo plug-in reattivo per JavaScript che descrive bene la pagina al ridimensionamento di una finestra sembra piuttosto interessante. Ma come sviluppatori, vogliamo sapere che cosa fa il codice quando ridimensioniamo la finestra. Prova a impostare il punto di controllo Controllo> Ridimensiona listener di eventi e puoi farlo. Nota: Sarà più che probabile dover passare un sacco di codice della libreria. Provalo sulla versione jQuery del plug-in Masonry e osserva come passare attraverso il codice su un breakpoint di ridimensionamento ti porta a passare attraverso molti interni di jQuery.
  • Molti siti Web, incluso GMail, consentono all'utente di incollare il contenuto. In questo caso, l'Appunti> Incolla punto di interruzione sarebbe utile.
  • Altre utili opzioni di breakpoint includono: invio di moduli, copia di dati, eventi di mutazione DOM, orientamento del dispositivo, pressioni di tasti, richieste Ajax, eventi del mouse (spostamento del mouse, spostamento, clic, ecc.) SetInterval, touchstart e altro.

Punti di intervento DOM

La scheda Punti di interruzione DOM visualizza i punti di interruzione per il DOM. Un modo semplice per vedere questo in azione è trovare un elemento che, per esempio, quando ha cliccato ha il suo nome della classe proprietà cambiata. Individua l'elemento nel pannello Elementi, fai clic con il pulsante destro del mouse e vai a Break On> Modifiche agli attributi. Il codice verrà interrotto quando cambiano i valori degli attributi di quell'elemento.

document.querySelector ('# button'). onclick = function () this.setAttribute ('some', 'thing'); ;

Il al clic il gestore di eventi sopra conta come una modifica di attributo, che presenta qualcosa di simile a questo:

Altre opzioni includono:

  • Modifiche del sottostrato si verificano quando un nodo nell'albero viene inserito o rimosso.
  • Modifiche di attributi si verificano quando si modifica l'attributo di un elemento.
  • Rimozione dei nodi si attiva quando si rimuove un elemento; per esempio: element.remove ().

Nota: Chrome sembra aver implementato il metodo remove (). Alcuni browser non supportano questo metodo; quindi, sarà necessario rimuovere removeChild ().


Timeline Panel

Il pannello Timeline ti consente di esaminare i problemi di rendimento della tua app Web. Lo scopo principale del pannello Timeline è (al momento della scrittura) per la visualizzazione delle informazioni, a differenza degli altri pannelli che consentono di eseguire azioni distruttive sulla pagina.

Le volte che potresti voler utilizzare il pannello Timeline includono:

  • Indagare il rendimento a scorrimento della tua pagina.
  • Cercando di migliorare gli FPS della tua animazione.
  • Creazione di pagine Web mobili che sono probabilmente visualizzate su una varietà di dispositivi vecchi e nuovi.
  • Rendere il web senza jank!
  1. Questi tre elementi (Eventi, Cornici e Memoria) presentano viste diverse, ciascuna delle quali illustra varie informazioni relative alle prestazioni.
  2. In questo montatura vista, ogni barra rappresenta un frame reso dal browser. Più la barra verticale è "piena", peggiore è la prestazione e le parti colorate nella barra sono spiegate nella legenda nella parte inferiore del pannello Timeline.
  3. È possibile codificare un punto di interruzione nel codice utilizzando il comando debugger; dichiarazione nel tuo codice.

  4. UN popover per record individuali, dettagliando per quanto tempo a disco ha preso per eseguire. Il popover, in alcuni casi, si collegherà alla riga di codice che ha causato l'esecuzione del record (è più probabile che si verifichi con record basati su script).
  5. La lista di record. Alcuni record sono attivati ​​dal nostro codice; altri record possono essere causati dalle azioni dell'utente. Ad esempio, lo scorrimento della pagina provoca un evento "Paint".
  6. Ogni record ha una riga corrispondente che illustra il tempo necessario per completare. Come mostrato nello screenshot, puoi aprire alcune barre facendo clic sulla freccia del menu a discesa.
  7. Opzioni di filtro che determinano quali record visualizzare. Tutti i record sono mostrati per impostazione predefinita. Se stai investigando su un particolare tipo di problema di prestazioni, puoi pulire i record registrati usando le opzioni di filtro.
  8. Per impostazione predefinita, tutti i record vengono visualizzati indipendentemente dal tempo impiegato per il completamento. Se vuoi pescare quei documenti insolitamente lunghi, cambia da 'Tutti' a una delle opzioni predefinite (come 15ms).
  9. Questo inizia a registrare (proprio come nel pannello Network). Diffida di lasciarlo registrare per un lungo periodo di tempo; sarai bombardato di dati! Quando guardo i problemi di scorrimento, premo il record, scorro la pagina per 2 secondi e quindi interrompe la registrazione.

Registrazione

Nella Parte 2, è possibile ricordare come abbiamo iniziato a registrare le informazioni di rete prima della pagina caricata al fine di catturare quante più richieste di rete possibili. Non lo facciamo nel pannello Timeline; stiamo meglio registrando eventi brevi e specifici. Non dobbiamo necessariamente * fare * qualsiasi cosa. Potremmo lasciarlo in registrazione per vedere cosa succede quando l'utente è inattivo, o se qualche timer potrebbe essere in esecuzione in background.

Le schede Eventi, Frames e Memoria vengono popolate durante la registrazione; quindi, assicurati di esaminarli per trovare i dati richiesti. La sezione Memoria può aiutarti a individuare potenziali perdite di memoria.

Record nella scheda Frames

I record vengono visualizzati durante e dopo le registrazioni. Una buona quantità di dati viene catturata all'interno dei record, come mostrato nell'immagine seguente.

Questa schermata mostra alcune richieste di rete (blu) e alcuni "ricalcoli stili" (viola). I ricalcoli di stile potrebbero accadere per una serie di motivi. I record gialli sono script e il verde rappresenta il rendering della pagina.

Cliccando su o passando con il mouse su un record vengono visualizzate ulteriori informazioni. Ad esempio, passando con il mouse su un record di 'pittura' potresti mostrare la parte della pagina che è stata dipinta.

Gli strumenti di sviluppo a volte collegano un record a un altro pannello. Ad esempio, il collegamento di un'immagine ti indirizza al pannello Risorse con quell'immagine a fuoco e un record XHR potrebbe collegarsi alla voce corrispondente nel pannello Rete..

Gli Strumenti per sviluppatori sono abbastanza gentili da avvisarci di potenziali ottimizzazioni. Si noti la piccola icona di notifica a destra di alcuni dei record nell'immagine seguente. Se è sbiadito, sarà necessario eseguire il drill down per individuare il record attuale che contiene le informazioni utili.

I popover a volte contengono un collegamento alla riga di codice che ha causato la visualizzazione del record. Ma una parola di avvertimento: la stampa carina non sempre aiuta, specialmente quando si guarda al codice di terze parti. Un'opzione è quella di impostare un punto di interruzione sulla linea a cui sei portato. Una volta messo in pausa il debugger, è possibile visualizzare i contenuti della variabile per comprendere meglio l'intento del codice.

filtraggio

Se sei come me, finisci sempre per acquisire più dati di cui hai bisogno, ma puoi creare una selezione attraverso le barre verticali (frame) che visualizzano solo i record corrispondenti alla porzione selezionata.

Se ti interessano solo i record lunghi, imposta un filtro per visualizzare solo i record lunghi. Puoi farlo nella parte inferiore del pannello Timeline.

Se lo scorrimento non è agevole come dovrebbe, prendere in considerazione l'esclusione di "Caricamento" (ad esempio record di rete). Detto questo, se sai che le richieste di rete vengono utilizzate per caricare i dati in una pagina che lo scorrimento infinito degli utenti, ti consigliamo di mantenere selezionato 'Caricamento'.

Non applicare filtri solo perché i dati appaiono troppo intensi all'inizio. Prenditi il ​​tempo per capire e indagare su quali strumenti di sviluppo ti stanno mostrando. Ti consigliamo di utilizzare la timeline per confermare dove si verificano i rallentamenti e mirare a ottenere quelle barre verticali più vuote possibili (spazio bianco / tempo di inattività).


Ulteriori letture

Il riquadro del contenuto principale ha molte delle funzionalità che potresti trovare negli editor di codice di base.

  • La documentazione ufficiale degli Strumenti per sviluppatori di Chrome include la documentazione per ciascun pannello. Si noti che gran parte della documentazione è stata scritta intorno ad aprile 2012 e alcuni degli screenshot sono obsoleti.
  • Strumenti per sviluppatori di Chrome: cerca o vai a file, metodi o numeri di riga. Le scorciatoie per la ricerca del testo e oltre sono brevi, ma utili, post di @addyosmani.
  • Modern Web Development è un post lungo e interessante scritto da @jtaby che copre molti dei pannelli degli strumenti di sviluppo.
  • Il mio flusso di lavoro: non dover mai lasciare DevTools (di Remy Sharp) dimostra la funzionalità di salvataggio dei file nel pannello delle fonti.
  • Google I / O 2012 - Chrome Developer Tools Evolution è un video di un'ora che dimostra gli strumenti di sviluppo. È molto pratico e informativo (di Sam Dutton e Pavel Feldman).
  • Aspetta, Chrome Dev Tools potrebbe farlo? Alcuni ottimi consigli su memoria e prestazioni, di @igrigorik
  • Il punto di rottura è un'interessante nuova serie di video dei membri del team di Chrome. Alcuni episodi sono già su YouTube! Episodio # 1, Episodio # 2, Episodio # 3 e Episodio # 4. Viene presentato da vari membri tra cui: Paul Irish, Paul Lewis, Addy Osmani e Sindre Sorhus.
  • Registra, esamina, Correggi è un aspetto dettagliato nel pannello Timeline, di Addy Osmani

Conosci altre risorse utili? Menzionalo nei commenti!