Anzeige
Anzeige
Verpasse keine News mehr!

Mit PostCSS den Code verbessern: Das Universalwerkzeug

PostCSS hat sich von einem Postprozessor zur Plattform für reibungslose CSS-Entwicklungsprozesse gemausert. Eine agile Community hat bis jetzt über hundert Plugins bereitgestellt, mit der Webworker das Werkzeug an ihre Prozesse anpassen können – wenn sie nicht gleich ihre eigenen Plugins entwickeln wollen.

7 Min.
Artikel merken
Anzeige
Anzeige

Wieder ein neues CSS-Framework? Nein! Begonnen hat PostCSS als Postprozessor, war also für den Prozess nach dem Erstellen von CSS-Code gedacht. Mittlerweile hat sich PostCSS aber zum nützlichen Universalwerkzeug für die Manipulation von CSS entwickelt. Heute ist PostCSS für CSS das, was „Babel“ für Javascript ist: Es hilft Webworkern bei der Arbeit mit modernen Funktionen. Bei einigen Entwicklern gilt PostCSS deshalb auch schon als bessere Alternative zu Sass oder LESS. Ein Nachteil von Sass war es lange Zeit, dass Entwickler dafür Ruby installieren mussten und so unter Umständen ihren Entwicklungsprozess mit Abhängigkeiten belasteten. PostCSS ist dagegen ein kleines Node.js-Javascript-Tool, das einen CSS-Parser mitbringt und durch seine API das CSS verändert.

Anzeige
Anzeige

Der wohl größte Pluspunkt ist, dass Entwickler eigene Plugins für PostCSS schreiben können. Darüber hinaus gibt es aktuell eine große Auswahl an bereits bestehenden
Plugins aus der großen und umtriebigen Entwicklergemeinde. Mit mehr als hundert Plugins [1] für unterschiedliche Aufgaben wie CSS-Linting, Komprimierung, Asset-Handling oder das Umwandeln künftiger CSS-Eigenschaften können Entwickler ihre
Prozesse beliebig gestalten.

Autoprefixer

Das bekannteste und in den letzten Jahren auch nützlichste PostCSS-Plugin ist Autoprefixer. Webworker kennen das: Viele neue CSS3-Eigenschaften sind per Vendor-Präfixe in die Browser implementiert. Die meisten Hersteller haben fleißig mitgemacht und eigene Präfixe eingeführt. Ein beliebtes Beispiel ist „border-radius“. So las man oft folgendes Beispiel im Netz:

Anzeige
Anzeige
Das Vendor-Präfix „border-radius“
.rounded-corner { -webkit-border-radius: 1em; -moz-border-radius: 1em; border-radius: 1em; }

Listing 1

border-radius benötigt schon lange keine Vendor-Präfixe mehr, doch bei anderen Eigenschaften sieht das nicht so aus. Jede neue Eigenschaft doppelt und dreifach schreiben zu müssen ist jedoch nicht gerade optimal. Für Sass gab es das Plugin Compass, das eine Vielzahl an CSS3-Mixins lieferte, die diese Aufgabe übernahmen. Man inkludierte einmal das Mixin und Compass schrieb fortan die Vendor-Präfixe. Das Problem war, dass Compass die Vendor-Präfixe immer einsetzte, egal ob sie notwendig waren oder nicht.

Anzeige
Anzeige

Das löst Autoprefixer besser, denn bei dem Modul können Programmierer angeben, welchen Browser sie unterstützen möchten. Autoprefixer prüft dann anhand der caniuse.com-Daten [2], ob ein Präfix für die definierten Browser notwendig ist, und fügt die noch notwendigen Vendor-Präfixe zu den CSS-Eigenschaften hinzu.

Präfix-Prüfung durch Autoprefixer
['last 2 versions', 'ie >= 11', 'Android >= 4.4', 'Firefox ESR']

Listing 2

Entwickler können somit standardkonformes CSS schreiben und Autoprefixer wandelt dieses in ein CSS um, das alle Browser verstehen, die der Website-Betreiber unterstützen will – und zwar so intelligent, dass Autoprefixer auch die unterschiedlichen Flexbox-Syntaxen und die verschiedenen linear-gradienten Schreibweisen einfügt.

Anzeige
Anzeige

Anstatt der caniuse-Daten können Autoprefixer-Nutzer mittlerweile auch eigene Analytics-Daten zugrunde legen. So lässt sich beispielsweise angeben, dass das Plugin alle Browser prüft, über die mehr als fünf Prozent aller Zugriffe auf die Website kommen.

Autoprefixer auf Basis von Analytics-Daten
require('autoprefixer')({ browsers: ['> 5% in my stats', { stats: 'path/to/the/stats.json' }] })

Listing 3

doiuse

Ein weiteres sehr nützliches PostCSS-Plugin, das zur Code-Qualität beiträgt, ist doiuse. Es überprüft, ob ein Entwickler im Projekt CSS-Eigenschaften verwendet hat, die einer der konfigurierten Zielbrowser nicht versteht.

Unterstützte CSS-Eigenschaften prüfen
require('doiuse')({ browsers: ['last 2 versions', 'ie >= 9', 'Android >= 4.3'], ignore: ['rem', 'css-boxshadow', 'css-transitions'] })

Listing 4

Der Beispiel-Code oben gibt etwa an, dass der Internet Explorer ab Version 9 die darin verwendeten Eigenschaften unterstützten soll. Verwendet ein Webworker nun Flexbox-Eigenschaften in seinem CSS, schlägt das Plugin Alarm, da der IE9 dies nicht versteht. Wer die Anweisung „calc()“ nutzt, erhält ebenfalls eine Warnung, da Android in älteren Versionen als 4.4 diese Funktion nicht unterstützt.

Anzeige
Anzeige

Einen teilweisen oder fehlerhaften Support zeigt doiuse ebenfalls als entsprechend an. Das Plugin überprüft aber nicht, ob der „buggy“-Fall im CSS überhaupt Anwendung findet. Das kann leicht verwirren. Dieses Verhalten soll sich laut Plugin-Autor aber in Zukunft ändern. Das Plugin soll dann besser kennzeichnen, welche Eigenschaft fehlerhaften oder teilweisen Support hat und welcher Browser die Eigenschaft überhaupt nicht versteht.

Stylelint

Das Linting überprüft, ob ein Code den Coding-Guidelines entspricht, und ist aus Javascript (JSlint) bekannt. Ähnlich können Entwickler mit Stylelint ihr CSS auf korrekten Code-Style überprüfen. Kommt ein Präprozessor wie Sass oder LESS im Workflow zum Einsatz, überprüft Stylelint das geschriebene SCSS/LESS vor dem Kompilieren. Dieses und einige andere Plugins haben dafür gesorgt, dass sich PostCSS vom reinen Postprozessor zum allgemeinen CSS-Werkzeug entwickelt hat. Stylelint sichert nicht nur die Code-Qualität sondern findet auch Fehler im CSS. Es sollte in einem modernem Workflow daher nicht fehlen.

Viel genutzt in Sass: @import, Variablen und Nesting

Zwei der meist genutzten Funktionen von Sass sind zum einen @import, die Sass-Partials in andere Dateien einfügt, und zum anderen Nesting, das Anweisungen und Variablen verschachtelt. Die PostCSS-Plugins „postcss-import“, „postcss-simple-vars“ und „postcss-nested“ bieten diese Funktionen ohne Sass. Für modulare Code-Strukturen ist das unverzichtbar.

Anzeige
Anzeige

Variablen finden hier in einer ähnlichen Weise wie bei Sass/LESS Verwendung. Im Unterschied zu nativen CSS-Variablen (Custom Properties) liegen sie nur in einfacher Schreibweise vor. Wer aber die standardisierten CSS-Custom-Properties nutzen will, kann CSS Next (etwa „postcss-css-variables“ oder „postcss-custom-properties“) gebrauchen.

Die Frage bleibt, wie sinnvoll es ist, durch eine Vielzahl an Plugins einen Workflow zu verkomplizieren. Doch einen Präprozessor kann man mit PostCSS definitiv ablösen.

Über hundert Plugins gibt es mittlerweile, um PostCSS an den jeweiligen CSS-Entwicklungsprozess anzupassen. Eines ist zum Beispiel der Autoprefixer, der anhand der caniuse-Daten prüft, ob ein Präfix überhaupt notwendig ist.
Über hundert Plugins gibt es mittlerweile, um PostCSS an den jeweiligen CSS-Entwicklungsprozess anzupassen. Eines ist zum Beispiel der Autoprefixer, der anhand der caniuse-Daten prüft, ob ein Präfix überhaupt notwendig ist.

CSS Next

CSS Next [3] ist ein Sammelsurium an Plugins, die mehrere Funktionen haben. Entwickler können mit CSS Next jetzt schon die CSS-Syntax der Zukunft schreiben.Es ermöglicht unter anderem die Definition von Variablen in nativer Variablen-Syntax (Custom Properties), den Einsatz von Custom Media Queries oder es wandelt Pixel-Angaben automatisch in rem-Werte um. Zudem bringt CSS Next auch den Autoprefixer und Sass-Funktionen wie etwa das Nesting mit. Es ist damit eine Art Transpiler für CSS.

Anzeige
Anzeige
Custom Properties
/* custom properties */ :root { --heading-color: #ff0000; } /* custom selectors */ @custom-selector :--headings h1, h2, h3, h4; /* usage */ :--headings { color: var(--heading-color); }

Listing 5

CSSNext kompiliert das zu
h1, h2, h3, h4 { color: #ff0000; }

Listing 6

Es ist praktisch, dass Entwickler somit neue Syntaxen und Techniken ausprobieren und im Projektalltag einsetzen können, ohne darauf zu warten, dass alle Browser die neuen Funktionen unterstützen.

postcss-assets

Compass (für Sass) liefert eine besonders praktische Funktion: Es kann die Breite und Höhe einer Datei auslesen. Diese Funktion gibt es auch über das Plugin „postcss-assets“.

Beispiel: Breite eines Logos auslesen
.logo { width: width("logo.svg"); height: height("logo.svg"); }

Listing 7

Das kompilierte CSS
.logo { width: 100px; height: 40px; }

Listing 8

Zudem können Entwickler mit postcss-assets Grafikdateien direkt ins CSS einbetten lassen, also extern verlinkte Dateien in sogenannte Inline-Images umwandeln, was HTTP-Requests spart. Am Beispiel eines background-image sähe das so aus:

Anzeige
Anzeige
Grafik als background-image ausgeben
.logo { background-image: inline("logo.svg"); }

Listing 9

Das kompilierte CSS
background-image: url("data:image/svg+xml,%3Csvg...")

Listing 10

Desweiteren lässt sich in dem Plugin eine Cachebusting-Funktion für die im CSS verlinkten Bilder aktivieren, was bei Seiten mit sehr aggressiv eingestelltem Clientside-Caching sehr hilfreich ist.

postcss-svg

Das Plugin postcss-svg stellt, wie der Name schon andeutet, Hilfen für die Arbeit mit SVGs bereit. Wie bei der postcss-asset-Funktion „inline()“ können Webworker auch mit postcss-svg SVG-Dateien direkt ins CSS einbetten.

SVG-Dateien enkodieren und ins CSS schreiben
.svg-bg { background-image: svg('path/to/bg-svg'); }

Listing 11

Das kompilierte CSS
.svg-bg { background-image: url("data:image/svg+xml,%3Csvg...") }

Listing 12

So weit so gut – doch so richtig hilfreich wird das Plugin erst, wenn Entwickler mehrere gleiche Assets mit unterschiedlichen Farben benötigen. Mit postcss-svg können sie nämlich die SVG-Dateien über Parameter verändern:

Anzeige
Anzeige
Veränderung der Hintergrundfarbe
.svg-bg1 { background-image: svg('path/to/bg-svg', '[fill]: #{$color-text}'); } .svg-bg2 { background-image: svg('path/to/bg-svg', '[fill]: #{$color-main}'); }

Listing 13

Wer Assets kodiert ins CSS einbindet, muss die Datei vorher unbedingt so stark wie möglich komprimieren. Auch dafür gibt es mit PostCSS mehrere Möglichkeiten.

CSSnano

Zur Komprimierung von SVG eignet sich die Script-Sammlung CSSnano [4]. Letztere will weitergehen als die CSS-Minifier von Sass und Co. Daher entfernt es nicht nur „Whitespaces“, sondern zieht auch die CSS-Regeln zusammen, die den gleichen Selektor haben. Allerdings ist dabei Vorsicht geboten, da sich dadurch die Kaskade und damit das Ergebnis ungewollt verändern können.

Zudem will CSSnano z-Indizes simplifizieren. Auch das führt manchmal dazu, dass sich die Optik ändert. Es empfiehlt sich daher, CSSnano vor dem Praxiseinsatz ausführlich gegenüber dem bisherigen CSS-Minifier zu testen. Wer auf Nummer sicher gehen will, sollte die Anweisung „options.safe = true“ setzen, um die aggressiven Optimierungen nicht durchzuführen.

Fazit: Umfangreiche Dokumentation, einfache API und eigene Plugins

Die Liste an Plugins für PostCSS ist lang. Wer einen Präprozessor ersetzen will, kann CSSNext oder PreCSS [5] verwenden. Und wer nicht in die Falle von Flexbugs [6] tappen möchte, kann mit postcss-flexbugs-fixes [7] viele der Bugs bereits im Buildtask eliminieren. Mit postcss-debug können Entwickler die einzelnen Stufen debuggen, wenn sie mehrere Plugins verwenden und die Ausgabe nicht wie erwartet läuft.

Auch für die Barrierefreiheit bietet PostCSS Plugins, die unterschiedliche CSS-Versionen erstellen. So gibt es sicher für jeden Entwickler nützliche Plugins. Die Seite postcss.parts führt viele PostCSS-Plugins in mehreren Kategorien auf. Zudem vereinfacht die umfangreiche Dokumentation und einfache API die Entwicklung eigener Plugins.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Kommentare

Community-Richtlinien

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Kommentar abgeben

Melde dich an, um Kommentare schreiben und mit anderen Leser:innen und unseren Autor:innen diskutieren zu können.

Anmelden und kommentieren

Du hast noch keinen t3n-Account? Hier registrieren

Anzeige
Anzeige