Zum Hauptinhalt springen

Render-Blocking CSS/JS und aufgeblähte Bundles beheben

Blockierendes CSS/JS, unminifizierter und ungenutzter Code sowie unnötige Polyfills verzögern jede erste Anzeige. So bauen Sie ein schlankes, nicht blockierendes Bundle.

Performance / CWV3 Min. LesezeitVeröffentlicht am Aktualisiert am
Inhaltsverzeichnis

Was ist das Problem#

Bevor ein Browser eine Seite anzeigen kann, muss er bestimmte CSS- und JavaScript-Dateien vollständig herunterladen, parsen und ausführen. Diese Dateien nennt man render-blockierend: Solange sie nicht fertig verarbeitet sind, bleibt der Bildschirm leer, selbst wenn der HTML-Inhalt längst da wäre. EverAudit meldet diesen Zustand als render-blocking-resources bzw. render-blocking-insight. Verschärft wird das Problem häufig durch drei zusätzliche Faktoren, die EverAudit einzeln prüft: unminifizierten Code (unminified-css, unminified-javascript), der unnötigen Leerraum und Kommentare mitüberträgt; ungenutzten Code (unused-css-rules, unused-javascript), der auf der jeweiligen Seite gar nicht gebraucht wird; und Legacy-JavaScript (legacy-javascript, legacy-javascript-insight) — Polyfills für längst veraltete Browser, die auch an aktuelle Browser ausgeliefert werden.

Warum EverAudit das prüft#

Render-blockierende Ressourcen wirken sich direkt auf den ersten sichtbaren Inhalt einer Seite aus und damit auf den Largest Contentful Paint. Ein zu großes JavaScript-Bundle wirkt sich zusätzlich auf die Interaktivität aus, weil der Browser es nach dem Download noch parsen und ausführen muss, bevor die Seite auf Eingaben reagieren kann — siehe Interaktivität (TBT/INP). EverAudit trennt Ursache (blockierende Datei), Symptom (unnötige Größe durch fehlende Minifizierung) und Ballast (ungenutzter oder veralteter Code) bewusst auf, weil jede dieser Ursachen eine eigene, unabhängige Lösung hat und in der Build-Pipeline an unterschiedlicher Stelle behoben wird.

Welche Auswirkung hat es#

Jede zusätzliche Sekunde bis zum ersten sichtbaren Inhalt erhöht die Wahrscheinlichkeit, dass ein Besucher die Seite verlässt, bevor er überhaupt etwas gesehen hat. Ein aufgeblähtes JavaScript-Bundle verlangsamt zusätzlich jede spätere Interaktion, weil der Browser mehr Code parsen und ausführen muss, als für die eigentliche Seite nötig wäre — ein Effekt, der auf leistungsschwächeren Geräten deutlich stärker ausfällt als im Test am Entwickler-Rechner. Da sowohl LCP als auch die Interaktivität zu den Core Web Vitals zählen, wirkt sich ein aufgeblähtes, blockierendes Bundle potenziell auch auf das Ranking bei Google aus.

Wie Sie es beheben#

1. Kritisches CSS inline platzieren, den Rest asynchron laden. Nur die Stile, die für den sichtbaren Bereich beim ersten Rendern nötig sind, gehören inline in den <head>; der Rest wird als separate Datei nachgeladen:

<style>/* nur kritisches Above-the-fold-CSS */</style>
<link rel="preload" href="/styles.css" as="style" onload="this.rel='stylesheet'">

2. JavaScript auf defer oder type="module" umstellen, damit es die HTML-Verarbeitung nicht blockiert:

<script src="/app.js" defer></script>

3. CSS und JavaScript über den Production-Build minifizieren lassen (z. B. mit esbuild, swc, terser für JS bzw. cssnano für CSS) — bei den meisten modernen Bundlern ist das bereits Standard im Produktions-Build, sollte aber verifiziert werden.

4. Ungenutztes CSS und JavaScript entfernen. Mit dem Coverage-Tab der Chrome DevTools identifizieren Sie, welcher Anteil einer Datei auf einer konkreten Seite tatsächlich verwendet wird. Tree-Shaking, Route-basiertes Code-Splitting und CSS-Purging-Werkzeuge (z. B. für Utility-First-Frameworks) reduzieren den Ballast auf das tatsächlich Benötigte.

5. Die Browser-Zielgruppe (Browserslist) aktualisieren, damit der Build keine Polyfills für Browser erzeugt, die praktisch niemand mehr nutzt. Das entfernt Legacy-JavaScript, ohne dass Sie manuell etwas löschen müssen — der Build-Prozess generiert dann von vornherein moderneren, kleineren Code.

6. Große Abhängigkeiten hinterfragen. Prüfen Sie, ob ein umfangreiches UI- oder Utility-Framework wirklich vollständig benötigt wird, oder ob eine schlankere Alternative bzw. der gezielte Import einzelner Funktionen ausreicht.

Fazit#

Render-Blocking-Probleme entstehen selten durch eine einzelne Ursache, sondern durch das Zusammenspiel aus blockierender Ladereihenfolge, fehlender Minifizierung, ungenutztem Code und veralteten Polyfills. Wer kritisches CSS inline platziert, JavaScript verzögert lädt und die Build-Pipeline so konfiguriert, dass sie automatisch minifiziert, tree-shaked und nur für tatsächlich relevante Browser baut, verkleinert das Bundle spürbar und beschleunigt sowohl die erste Anzeige als auch die spätere Interaktivität.

Häufige Fragen

Was bedeutet render-blockierend?

Eine render-blockierende Ressource ist eine CSS- oder JavaScript-Datei, die der Browser vollständig herunterladen und verarbeiten muss, bevor er überhaupt beginnt, die Seite anzuzeigen. Bis dahin bleibt der Bildschirm leer, selbst wenn der restliche Inhalt längst verfügbar wäre.

Was ist der Unterschied zwischen unminifiziertem und ungenutztem Code?

Unminifizierter Code enthält unnötige Leerzeichen, Kommentare und lange Bezeichner, die für die Ausführung irrelevant sind und die Dateigröße unnötig vergrößern. Ungenutzter Code dagegen wird auf der jeweiligen Seite gar nicht ausgeführt, aber trotzdem vollständig mitgeladen.

Was ist Legacy-JavaScript und warum ist es ein Problem?

Legacy-JavaScript sind Polyfills und Transpilierungen für sehr alte Browser, die an moderne Browser ausgeliefert werden, obwohl diese die entsprechenden Funktionen bereits nativ unterstützen. Das erzeugt für nahezu alle Besucher unnötigen, ungenutzten Ballast.

Wie finde ich heraus, welches CSS auf einer Seite ungenutzt ist?

Der Coverage-Tab in den Chrome DevTools zeigt beim Laden einer Seite an, welcher Anteil von CSS und JavaScript tatsächlich ausgeführt wird und welcher ungenutzt bleibt. Das ist der übliche Startpunkt, um Kandidaten für Tree-Shaking oder Route-Splitting zu identifizieren.

Sollte ich CSS und JavaScript grundsätzlich inline einbinden?

Nur das kritische CSS, das für den sichtbaren Bereich beim ersten Rendern nötig ist, gehört inline in den <head>. Der Rest sollte weiterhin als separate, cachefähige Datei ausgeliefert werden, da vollständig inline eingebetteter Code bei jedem Seitenaufruf erneut übertragen wird.

EverAudit Redaktion

Fachredaktion für Web-Qualität, Barrierefreiheit und DSGVO. Wir prüfen jeden Ratgeber gegen die Kriterien unserer Audit-Engine.