CSS-Minifizierer

Komprimieren Sie CSS-Code, indem Sie Kommentare, Whitespace entfernen und Werte optimieren.

Über die CSS-Minifizierung

Es ist verlockend anzunehmen, dass weil Brotli Textströme so aggressiv komprimiert, der marginale Wert eines separaten Minifizierungsdurchlaufs verschwunden sei. Der Engineering-Blog von Sentry hat im April 2024 genau dieses Argument durchgespielt und das Gegenteil festgestellt: Minifizierung lohnt sich weiterhin. Bei einer globalen mittleren mobilen Internetgeschwindigkeit von rund 53 Mbps und Brotli universell am CDN-Rand eingesetzt gilt: „Wenn man bei jedem Seitenaufruf nur 1 KB von insgesamt 100 Ressourcen einsparen kann, ergibt das eine Verbesserung der Seitengeschwindigkeit um 15 ms für diese Nutzer.“ Multipliziert mit der Besucherbasis irgendeiner nicht trivialen Site wird daraus eine echte Bandbreitenrechnung, ein echter Akkukosten auf Mobilgeräten und eine echte Positionsänderung in einem Lighthouse-Bericht.

Der Mechanismus zählt. Gzip und Brotli sind verlustfreie Allzweck-Kompressoren, die nach wiederholten Byte-Sequenzen suchen und jede Wiederholung als Rückwärtsreferenz in ein Sliding-Window-Wörterbuch kodieren. Zwei CSS-Dateien, die dasselbe Browserverhalten erzeugen, aber unterschiedliche Bytes enthalten, werden zu zwei verschiedenen Größen komprimiert. margin: 10px 10px 10px 10px; und margin:10px sind semantisch identisch, aber das erste hat mehr Zeichen, die kodiert werden müssen, auch wenn viele Wiederholungen sind, Brotli ist gut darin, Wiederholungen zu finden, versteht aber nicht, dass zwei syntaktisch verschiedene CSS-Strings dieselbe Regel ausdrücken. Nur ein CSS-bewusster Minifizierer kann das. Der Lernhub von Cloudflare beziffert typische Rohtext-Reduktionen mit 30-50 %; Brotli darüber fügt weitere bescheidene 5-15 % hinzu, aber das ist nicht null, und im Maßstab summiert sich das.

CSS blockiert das Rendering, und deshalb zählen Bytes

Largest Contentful Paint ist einer der drei Core Web Vitals; die Schwelle für „Gut“ liegt bei 2,5 Sekunden im 75. Perzentil der Seitenaufrufe. Der Gesamt-Performance-Score von Lighthouse gewichtet LCP mit 25 % der Gesamtbewertung. CSS blockiert standardmäßig das Rendering, wenn der Browser ein <link rel="stylesheet"> sieht, pausiert er das Rendering, bis diese Datei heruntergeladen und das CSSOM aufgebaut ist, weil Regeln später in der Stylesheet-Datei frühere Regeln überschreiben können und der Browser nicht riskieren kann, in einem unstilisierten oder falsch stilisierten Zustand zu zeichnen. Das CSS Object Model wird im Gegensatz zum DOM nicht inkrementell aufgebaut, der Parser braucht das ganze Stylesheet, um zu wissen, welche Regeln gewinnen. JavaScript blockiert ebenfalls darauf: Skripte können nicht sicher laufen, solange das CSSOM unvollständig ist. Die praktische Implikation ist, dass jedes Byte render-blockierenden CSS auf dem kritischen Pfad jedes Core Web Vitals liegt. Ein 100-KB-Minified-Bundle spart bei einer schnellen 4G-Verbindung vielleicht 30 ms gegenüber einem 150-KB-unminified-Bundle, pro Seite klein, aber die Vodafone-Fallstudie zeigte einen Umsatzanstieg von 8 % bei einer LCP-Verbesserung von 31 %. Der Effekt zweiter Ordnung ist noch größer: ein schnelleres LCP erhöht Lighthouse-Scores, was die Sichtbarkeit in der Google-Suche für Sites erhöht, bei denen Web Vitals ein bekanntes Ranking-Signal sind.

Was ein CSS-Minifizierer tatsächlich macht

Minifizierer vs Optimierer, die Linie sicher-vs-aggressiv

Die Dokumentation von cssnano unterscheidet zwischen seinem „default“-Preset (nur sichere Transformationen) und seinem „advanced“-Preset (aggressive Transformationen, die von Annahmen über dein CSS abhängen). Das Default-Preset ist das, was du ohne nachzudenken einschaltest; das Advanced-Preset ist das, was du nach einem Audit einschaltest, weil manche Optimierungen Code brechen können, der von subtilem Kaskadenverhalten, Vendor-Präfixen oder Browser-Quirks abhängt. Advanced-Transformationen können Regeln innerhalb eines Stylesheets umordnen, um die Komprimierbarkeit zu verbessern, riskant, wenn du absichtliche Duplikat-Property-Fallbacks wie display: flex; display: grid; hast. Sie können identische Regelkörper in kommagetrennte Selektor-Listen zusammenführen. Sie können überschriebene Deklarationen als toten Code entfernen, mit demselben Fallback-Vorbehalt. Sie können display-Werte, Transform-Funktionen und Custom Identifiers normalisieren, translate3d(0,0,0) kann sich zu translate(0) vereinfachen, wenn du nicht vom GPU-Promotion-Nebeneffekt abhängst. Sie können ungenutzte Vendor-Präfixe basierend auf einem Browserslist-Ziel entfernen. csso (Yandex, 2011) beschreibt sich selbst als „strukturellen Optimierer“ statt als reinen Minifizierer, mit drei Transformationskategorien: Reinigung, Kompression und Restrukturierung. Lightning CSS beschreibt dieselbe Aufteilung: ein „minify“-Durchlauf, der immer sicher ist, plus eine Reihe von targets-bewussten Transformationen, die modernes CSS auf das herunterbringen, was ältere Browser verstehen. Die ehrliche Linie: ein Minifizierer ist das, was du auf jede CSS-Datei gedankenlos anwenden kannst; ein Optimierer ist das, was du mit Wissen über deine Codebasis anwendest.

Eine kurze Geschichte des CSS-Minifizierungs-Tooling

YUI Compressor (2007). Yahoos Julien Lecomte kündigte YUI Compressor am 11. August 2007 an. Die ursprüngliche Veröffentlichung handhabte nur JavaScript; drei Tage später fügte Version 2.0 CSS-Unterstützung hinzu, indem ein regex-basierter CSS-Minifizierer integriert wurde, der ursprünglich von Isaac Schlueter für den persönlichen Gebrauch geschrieben worden war. YUI Compressor war mehrere Jahre lang der De-facto-Standard, besonders in den Java/Maven- und Rails-Asset-Pipeline-Welten; er wird heute noch verwendet, obwohl die YUI-Bibliothek selbst 2014 von Yahoo eingestellt wurde. Die CSS-Seite von YUI Compressor war immer regex-basiert, nicht AST-basiert, eine Designentscheidung, deren Konsequenzen in den kleineren Browser-seitigen Tools nachhallen, die folgten.

clean-css (2011). Jakub Pawlowicz veröffentlichte clean-css 2011 unter der Organisation GoalSmashers auf GitHub, vermarktet als „schneller und effizienter CSS-Optimierer für Node.js und das Web“. Es war der erste große CSS-Minifizierer, der speziell für das Node.js-Ökosystem konzipiert wurde, und wurde zum Standard in Grunt- und Gulp-Pipelines. Die aktuelle 5.x-Linie zieht etwa 21 Millionen wöchentliche Downloads von npm, unterstützt @import-Inlining, URL-Rebasing und Source Maps und hat ein gestuftes „Optimierungslevel“-Modell, das die Sicher-vs-Aggressiv-Aufteilung explizit macht. csso (2011) entstand als internes Yandex-Projekt, veröffentlicht mit Copyright 2011 von Sergey Kryzhanovsky basierend auf einer Idee von Vitaly Harisov. cssnano (April 2015) von Ben Briggs verfolgte einen anderen Ansatz: statt eines monolithischen Minifizierers ist cssnano ein kuratiertes Bündel kleiner PostCSS-Plugins (~30 im Default-Preset). Er wurde zum dominierenden CSS-Minifizierer im JavaScript-Ökosystem, größtenteils wegen dieser Komponierbarkeit und weil PostCSS selbst (Andrey Sitniks Framework, erstmals im November 2013 veröffentlicht) zum Substrat für so viel anderes wurde (Autoprefixer, Stylelint, Tailwinds Verarbeitungs-Pipeline). cssnano sitzt jetzt bei Version 7.x und ist der Default-CSS-Minifizierer in webpacks css-minimizer-webpack-plugin, in Next.js und in vielen anderen Framework-Defaults.

esbuilds CSS-Minifizierer (2020-2021). Evan Wallace, Mitgründer von Figma, veröffentlichte esbuild als „ein Hobbyprojekt, das ich in den Winterferien 2019-2020 geschrieben habe“. In Go geschrieben, war esbuild 10-100× schneller als die JavaScript-basierten Bundler der Zeit. Die CSS-Unterstützung reifte über 2021; sie ist jetzt allgegenwärtig als zugrundeliegender Minifizierer in Vite, in tsup, in unzähligen Framework-Templates. Lightning CSS (2021/2022). Devon Govett, Schöpfer von Parcel, kündigte 2021 Parcel CSS an, einen CSS-Parser, Transformer, Bundler und Minifizierer, von Grund auf in Rust geschrieben. Das Versprechen war Geschwindigkeit (10-100× schneller als die JS-basierten Etablierten) plus Korrektheit (ein echter, der CSS-Spezifikation folgender Parser, kein Regex-Pattern-Matching) plus targets-bewusste Kompilierung (modernes CSS auf das herunter, was ältere Browser verstehen, wie Babel für JavaScript). 2022 wurde das Projekt zu Lightning CSS umbenannt, um es von Parcel als eigenständiges Werkzeug zu lösen. Es ist jetzt Vites empfohlene moderne CSS-Pipeline, der Default in Parcel selbst und eine Option in css-minimizer-webpack-plugin. Tailwinds Next-Generation-Engine Oxide integriert es.

Die moderne CSS-Pipeline

Moderne Webprojekte schreiben selten rohes CSS direkt in eine Stylesheet-Datei. Sass (Hampton Catlin und Natalie Weizenbaum, erstmals 2006 veröffentlicht), Less (Alexis Sellier, 2009) und Stylus (TJ Holowaychuk, 2010) sitzen vorn an der Pipeline und fügen Variablen, Verschachtelung, Mixins, Funktionen und Partials hinzu. Der Compiler emittiert Vanilla-CSS, das dann durch PostCSS für Transformationen wie Autoprefixer (Vendor-Präfix-Anwendung basierend auf Browserslist), Auspackung verschachtelten CSS und Herabstufung modernen CSS fließt. Erst nach all dem läuft der Minifizierer, auf dem finalen flachen CSS. Moderne Bundler liefern CSS-Minifizierung standardmäßig, webpack 5 enthält css-minimizer-webpack-plugin (cssnano unter der Haube standardmäßig, mit cssoMinify, cleanCssMinify, esbuildMinify und lightningCssMinify alle wählbar); Vite verwendet esbuild für CSS standardmäßig und unterstützt Lightning CSS als Opt-in; Parcel verwendet Lightning CSS; Next.js, Remix, Astro, SvelteKit und Nuxt bündeln Minifizierung in Produktions-Builds ohne Eingriff des Entwicklers. Das Ergebnis: für jeden, der eine moderne Build-Pipeline verwendet, geschieht CSS-Minifizierung automatisch.

Aber nicht jeder verwendet eine Build-Pipeline. Viele WordPress-Sites, handgeschriebene HTML-Seiten, Jekyll/Hugo/Eleventy-Static-Sites ohne JS-Toolchain und Einmalprojekte liefern CSS, das nie in der Nähe von webpack war. Für diese ist ein Browser-Minifizierer der Pfad des geringsten Widerstands, CSS einfügen, Ergebnis kopieren, Deployment speichern.

Critical CSS

Eine ergänzende Technik, die es zu kennen gilt: Critical CSS ist die Praxis, die Teilmenge von Stilen zu identifizieren, die zum Rendern des above-the-fold Viewports nötig sind, diese Teilmenge direkt in einen <style>-Block im Dokumentkopf zu inlinen und den Rest des Stylesheets auf einen nicht-blockierenden Ladevorgang zu verzögern. Gut gemacht zeichnet die Seite ihren anfänglichen Viewport in der allerersten Netzwerkrunde, ohne separate Anfrage für ein externes Stylesheet überhaupt. Filament Group baute das kanonische Tooling, Scott Jehl veröffentlichte loadCSS am 14. Juli 2014, ein kleines JavaScript-Hilfsprogramm, das ein Stylesheet asynchron lädt, indem es sein media-Attribut auf einen nicht-passenden Wert setzt und es dann auf all zurückschaltet, sobald die Datei heruntergeladen ist. Das Muster wurde schließlich Standard genug, dass Browser <link rel="preload" as="style" onload="this.rel='stylesheet'"> als direktere Ausdrucksweise hinzufügten. Jason Miller (Schöpfer von Preact) veröffentlichte Critters unter GoogleChromeLabs 2018 als schnellere Alternative, statt einen Headless-Browser laufen zu lassen, um die gerenderte Seite zu inspizieren, macht Critters statische Analyse. Das Critters-Repository wurde 2024 archiviert; der aktiv gepflegte Fork lebt jetzt als Beasties unter dem Nuxt-Team. All diese Tools hängen davon ab, dass das zugrundeliegende CSS gut minifiziert ist, jedes im Quell-Stylesheet eingesparte Byte fließt in einen kleineren kritischen Inline-Block.

Die Legacy-Hacks sind weg

Moderne Browser parsen CSS alle nach derselben Spezifikation. Die historischen Hacks, die einst CSS-Minifizierung riskant machten, sind im Wesentlichen verschwunden: der * html-Hack zielte auf IE6 ab, indem er einen Parser-Bug ausnutzte; der Unterstrich-Hack _property: value zielte auf IE6 und früher; *property: value (mit * vor dem Property-Namen) zielte auf IE7 und früher; konditionale Kommentare <!--[if IE 6]> ließen dich verschiedene Stylesheets an spezifische IE-Versionen ausliefern, aber Microsoft entfernte dieses Feature in IE10. IE11 erreichte sein Lebensende am 15. Juni 2022 für die meisten Verbraucher-Windows-10-Versionen. Stand 2026 sind diese Hacks historische Kuriositäten und ein CSS-Minifizierer muss nicht mehr an sie denken. Ein moderner Minifizierer, der Whitespace einheitlich über Browser hinweg entfernt und die oben beschriebenen spezifikationsdefinierten Transformationen anwendet, ist sicher.

Was dieses Tool macht (und nicht macht)

Dieses Tool ist ein Single-File-Browser-Minifizierer, ungefähr 30 Zeilen JavaScript. Es tokenisiert String-Literale in Platzhalter, damit nachfolgende Durchläufe ihren Inhalt nicht korrumpieren können, entfernt /* ... */-Kommentare, kollabiert Whitespace um {, }, :, ;, ,, >, ~, +, entfernt das abschließende Semikolon vor }, kollabiert Whitespace-Folgen zu einem einzigen Leerzeichen, kürzt sechsstellige Hex-Farben in die dreistellige Form, wenn jedes Ziffernpaar identisch ist, und entfernt die Einheit von Nullwerten für px, em, rem, %, pt, ex, ch, vw, vh, vmin, vmax. Es parst das CSS nicht in einen AST, es ist ein Regex-Durchlauf. Es kollabiert Longhand nicht zu Shorthand. Es führt Selektoren weder zusammen noch dedupliziert es sie. Es ordnet Deklarationen nicht um. Es konvertiert rgb() nicht in Hex und benannte Farben nicht in Hex. Es schreibt Keywords nicht klein. Es bewahrt /*!-„wichtige“-Kommentare nicht, alle Kommentare werden gleich entfernt; wenn du Lizenz-Header behalten musst, füge sie nach der Minifizierung wieder ein. Es emittiert keine Source Map. Die ehrliche Rahmung: füge das CSS ein, das aus deinem Editor oder deiner Hand kam, bekomme eine entrümpelte Version zurück, die typischerweise 20-40 % kleiner in Rohbytes ist, und benutze sie als Schnell-Deploy-Artefakt für handgebaute Sites. Für Projekte mit einer Build-Pipeline benutze cssnano oder Lightning CSS in dieser Pipeline; für die ohne entfernt dieses Tool die Reibung.

Warum nur-Browser hier zählt

Jeder webbasierte CSS-Minifizierer hat dieselbe architektonische Wahl: die Arbeit auf einem Server zu erledigen oder im Browser des Nutzers. Serverseitige Verarbeitung erfordert das Hochladen des Stylesheets über das Netzwerk, was bedeutet, dass eine Kopie dieses CSS in den Server-Logs liegt, möglicherweise in einem CDN-Cache, möglicherweise in einer Analytics-Pipeline, möglicherweise in einem Backup. Für die meisten CSS ist das harmlos. Für interne Tools, unveröffentlichte Produkt-Stile oder Stylesheets, die Selektoren enthalten, die interne Klassen-Taxonomien offenbaren (.admin-panel-internal-debug-info), ist es das nicht. Auch für gewöhnliches Marketing-Site-CSS kann ein Entwickler, der prüft, was er tatsächlich übers Netzwerk schickt, vernünftigerweise vorziehen, dass laufende Arbeit auf seinem Rechner bleibt. Ein rein browserbasierter Minifizierer (JavaScript, das in deinem Tab läuft und nach dem anfänglichen Seitenladen nie eine Netzwerkanfrage macht) umgeht das Problem. Du kannst es überprüfen: öffne den Network-Tab der DevTools, füge das CSS ein, klicke auf Minifizieren und beobachte ausgehende Anfragen. Es wird keine geben. Besser noch, trenne dich vom Internet (oder aktiviere den Flugzeugmodus), nachdem die Seite geladen ist, und das Tool wird trotzdem funktionieren, was der stärkste empirische Beweis dafür ist, dass nichts hochgeladen wird.

Häufig gestellte Fragen

Wie viel kleiner wird mein CSS?

Handformatiertes CSS mit Kommentaren und Einrückungen schrumpft typischerweise um 20-40 % in Rohbytes. CSS, das bereits aus Sass/Less kompiliert und leicht formatiert ist, schrumpft weniger. CSS, das durch PostCSS oder Autoprefixer verarbeitet wurde, hat oft schon minimale Kommentare und schrumpft am wenigsten. Die Größe nach Brotli-Kompression am CDN-Rand wird sich weiter verengen, Brotli auf minifiziertem CSS spart immer noch weitere 5-15 % gegenüber Brotli auf unminifiziertem CSS, abhängig davon, wie repetitiv der ursprüngliche Whitespace war.

Wird die minifizierte Ausgabe etwas brechen?

Für gewöhnliches CSS, nein, die Transformationen sind spec-sicher. Die zwei Fälle, die es wert sind, selbst geprüft zu werden: (1) Nullwerte innerhalb von calc(), min(), max(), clamp() und CSS Custom Properties sollten nicht unit-strippt werden, weil die Regeln typisierter Arithmetik eine Einheit verlangen; der Regex-Durchlauf dieses Tools ist konservativ, aber wenn du calc(0px + 10%) in deinem CSS hast, wirf einen Blick auf die Ausgabe. (2) Wenn dein Stylesheet Duplikat-Property-Fallbacks wie display: flex; display: grid; hat, bewahrt dieses Tool beide, aber fortgeschrittene Minifizierer wie cssnano mit dem Advanced-Preset würden den ersten entfernen. Wenn du von browserspezifischem Kaskadenverhalten abhängst, prüfe vor dem Deployment.

Bewahrt es Lizenz-Header?

Nein. Produktions-Minifizierer respektieren die Konvention, dass mit /*! (mit Ausrufezeichen) beginnende Kommentare als „wichtig“ bewahrt werden, gewöhnlich für Copyright-Header und Lizenz-Hinweise. Dieses Tool entfernt alle Kommentare gleich. Wenn du CSS lieferst, das einen Lizenz-Header braucht (MIT, GPL, BSD-Quellenangabe), füge den Header manuell wieder in die Ausgabe ein. Für eine Pipeline, die automatische Bewahrung braucht, benutze stattdessen cssnano oder Lightning CSS.

Soll ich es benutzen, wenn ich schon eine Build-Pipeline habe?

Wahrscheinlich nicht, dein Bundler macht das für dich. webpack 5 liefert css-minimizer-webpack-plugin mit cssnano unter der Haube; Vite verwendet esbuild für CSS-Minifizierung standardmäßig; Parcel verwendet Lightning CSS. Dieses Tool ist für die Fälle, die deine Build-Pipeline nicht abdeckt: handgeschriebenes HTML, WordPress-Themes, die ohne Node-Toolchain ausgeliefert werden, Static-Site-Generatoren, die keine Minifizierung bündeln, Einmal-CSS-Dateien für ein E-Mail-Template oder eine schnelle Demo. Für diese ist ein Paste-In-Browser-Tool der Pfad des geringsten Widerstands.

Werden meine Dateien hochgeladen?

Nein. Der Minifizierer ist JavaScript, das in deinem Browser läuft. Das CSS, das du einfügst, überquert nie das Netzwerk, überprüfe es im Network-Tab der DevTools, während du auf Minifizieren klickst, oder nimm die Seite nach dem Laden offline und bestätige, dass das Tool noch funktioniert. Interne Stylesheets, unveröffentlichte Produkt-Stile und CSS, das interne Klassen-Taxonomien offenbart, bleiben auf deinem Gerät.

Kann ich die Ausgabe später ent-minifizieren?

Nicht ganz, Kommentare und originaler Whitespace sind für immer weg, das ist der Sinn. Aber du kannst minifiziertes CSS formatieren, um es wieder lesbar zu machen. Pretty-Printer wie Prettier (mit dem CSS-Plugin), der eingebaute Format-Document-Befehl in VS Code oder eine der Online-„CSS-Beautifier“-Tools werden Einrückung und Zeilenumbrüche wieder einfügen. Sie können gelöschte Kommentare nicht wiederherstellen. Halte deine unminifizierte Quelle immer in der Versionskontrolle als kanonische Form.

Verwandte Tools