Für eine bessere Performance unserer Website ist die Optimierung unseres HTML, CSS und JavaScript nicht alleine ausreichend. Neben diesem ist die Verbeserung des kritischen Rendering-Pfads entscheidend. Er behandelt den Vorgang zwischen dem Empfang der Daten und deren Verarbeitung zur Darstellung im Browser. Unser Ziel ist es, Inhalte zu priorisieren um damit das erste Rendering erheblich zu verkürzen. Es hinterlässt eine veränderte Vorstellung von Gewschindigkeit bei den Nutzern.
Als Entwickler schreiben wir das Markup und unsere Seite erscheint im Browser. Doch wie genau wird unser HTML, CSS und JavaScript vom Browser verarbeitet um dargestellt zu werden? Welche Möglichkeiten und Tools gibt es um den Prozess zu optimieren? Wie sieht das in der Praxis aus? Neben diesen Fragen beschäftigt sich der Talk mit der Analyse bereits optimierter Websiten sowie einem praktischen Beispiel in dem die Schritte von der Analyse zur Optimierung veranschaulicht werden.
Der Talk fand am 16. Juni 2015 auf der Developer Week 2015 (#DWX15) in Nürnbert statt.
Die original Slides sind auf Google Drive unter https://goo.gl/UnW7YN zu finden.
3. @jowe
Critical Rendering Path?
● [ˈkriːtɪʃ]
“(...) so, dass man genau prüft und streng beurteilt”
● [rẹndern]
“(...) bezeichnet die Erstellung einer Grafik aus einer Skizze oder
einem Modell”
● [Pfa̲d]“(...) schmaler Weg”
13. @jowe
1000 ms ist die
Herausforderung
Verzögerung Reaktion des Users
0 - 100 ms Instant
100 - 300 ms Leicht spürbare Verzögerung
300 - 1000 ms Fokus, spürbare Verzögerung
1 s+ Gedankliches Abschweifen
10 s+ Ich geh dann mal wieder...
18. @jowe
DNS Lookup TCP Connection
HTTP Request
and Response
Server
Response Time
Client-Side Rendering
Netzwerk
verarbeiten und
rendern der Seite
100ms 150ms 150ms 200ms 400ms
Eine Sekunde auf mobilen Geräten
22. @jowe
<!doctype html>
<meta charset=utf-8>
<title>Performance!</title>
<link href=styles.css rel=stylesheet />
<p>Hello <span>world!</span></p>
● Bytes der index.html kommen an
● kein CSS bisher geladen
p { font-weight: bold; }
span { display: none; }
index.html
styles.css
CSS
DOM
CSSOM
Render
Tree
Network
HTML
Die Antworten kommen
paketweise. Chunk for Chunk
Die ersten HTML Pakete kommen an
24. @jowe
<!doctype html>
<meta charset=utf-8>
<title>Performance!</title>
<link href=styles.css rel=stylesheet />
<p>Hello <span>world!</span></p>
p { font-weight: bold; }
span { display: none; }
index.html
styles.css
CSS
DOM
CSSOM
Render
Tree
Network
HTML DOM
● <link> entdeckt, Anfrage gesendet
● DOM Konstruktion fertig!
DOM Konstruktion fertig. Warten auf CSS
Screen weiß. Das CSS blockt
das Rendering.
25. @jowe
<!doctype html>
<meta charset=utf-8>
<title>Performance!</title>
<link href=styles.css rel=stylesheet />
<p>Hello <span>world!</span></p>
p { font-weight: bold; }
span { display: none; }
index.html
styles.css
DOM
CSSOM
Render
Tree
Network
HTML DOM
● Die ersten Bytes vom CSS kommen an
● Wir warten weiter auf das komplette CSS!
CSS
Erste CSS bytes kommen an. Warten auf CSS!
Im Gegensatz zu HTML ist das
Laden von CSS nicht inkrementell
26. @jowe
<!doctype html>
<meta charset=utf-8>
<title>Performance!</title>
<link href=styles.css rel=stylesheet />
<p>Hello <span>world!</span></p>
p { font-weight: bold; }
span { display: none; }
index.html
styles.css
DOM
CSSOM
Render
Tree
Network
HTML DOM
● CSS fertig geladen
● Nun kann das CSSOM konstruiert werden
CSS CSSOM
Screen noch immer weiß?
Schließlich wird das CSSOM konstruiert!
27. @jowe
DOM + CSSOM = Render Bäume
body
Hello
span
world!
root
spanp
DOMCSSOM
p ● Match CSSOM + DOM nodes
● Der Screen ist weiterhin leer....
29. @jowe
HTML
CSS
DOM
CSSOM
Render
Tree
Layout PaintNetwork
Critical rendering path
Hello
● Sobald der Render Baum erstellt wurde,
geschieht dies auch mit dem Layout der Seite
(DOM + CSSOM)
○ Dimensionen, Farben etc.
● Sobald das Layout erstellt ist:
○ Rendern der Pixel (CPU)
○ Bitmaps werden übertragen (GPU)
○ Anzeigen der Seite
Dafür sollte
man ca. 100
ms einplanen.
30. @jowe
Zu beachtende Regeln
1. HTML wird inkrementell geparst
a. Nicht auf das ganze HTML warten - flush early and often
2. CSS blockiert das Rendering
a. CSS schnellstmöglich auf den Client bringen
33. @jowe
DOM
CSSOM
JavaScript element.style.color = "#FF0000"
JS kann auf das DOM und
das CSSOM zugreifen!
Welche Rolle spielt nun JavaScript?
● JavaScript blockiert die DOM Konstruktion
● JavaScript blockiert das Laden von CSS
35. @jowe
Zu beachtende Regeln
1. HTML wird inkrementell geparst
a. Nicht auf das ganze HTML warten - flush early and often
2. CSS blockiert das Rendering!
a. CSS schnellstmöglich auf den Client bringen
3. JavaScript blockiert die DOM Konstruktion und CSS
a. Inline kritisches JS, async loading
53. @jowe
Bilder komprimieren.
Passt die Auflösung?
Gibt es effektivere Typen? (jpg, png, gif)
Interlacing verwenden.
Mehrere Bilder in Sprites kombinieren.
Achtung bei
Responsive!
55. @jowe
Media Queries in eigene <link> Elemente packen.
Komprimieren des CSS
Unused Styles? - Weg damit!
CSS Optimieren (short definition)
Above the Fold CSS -> inline CSS
Mehrere CSS Files konkatenieren
Effektive Selektoren