Tailwind CSS v4 – Neue Features: Performance, Konfiguration und Migrationsleitfaden
35 Millisekunden – so lange brauchte Tailwind v3 für einen inkrementellen Build. In v4 sind es 192 Mikrosekunden. Nicht Millisekunden, Mikrosekunden.
Beim ersten Anblick dieser Zahl war ich skeptisch. Marketing kann jeder. Nach einer echten Migration und HMR von 340 ms auf 12 ms war klar: Tailwind meint es ernst.
Die Oxide-Engine in Rust liefert echte Verbesserungen – kein „fühlt sich etwas schneller an“, sondern: Padding ändern, speichern, Seite aktualisiert, bevor du blinzelst. Tailwind v4 ist mehr als ein neuer Motor: Konfiguration wandert von JS nach CSS, Installation wird Zero-Setup, Utility-Syntax ändert sich (Transparenz-Modifier, Container Queries, 3D Transforms …).
Dieser Artikel erklärt die Änderungen und liefert eine Migrations-Checkliste zum direkten Abarbeiten.
Oxide-Engine – warum v4 so schnell ist
Kennst du das? Farbe ändern, speichern, zwei bis drei Sekunden auf den Browser starren – besonders in großen Projekten mit Tailwind v3 und knappem Deadline-Druck.
Die Oxide-Engine in v4 zielt genau darauf. Statt den alten JS-Motor zu flicken, hat das Tailwind-Team den Compiler in Rust neu gebaut – mutig, aber mit messbarem Nutzen.
Wie viel Performance bringt es wirklich?
Offizielle Benchmarks am Catalyst-Projekt:
| Testszenario | v3.4 | v4.0 | Faktor |
|---|---|---|---|
| Vollständiger Build | 378 ms | 100 ms | 3,78× |
| Inkrementeller Build (CSS geändert) | 44 ms | 5 ms | 8,8× |
| Inkrementeller Build (kein CSS geändert) | 35 ms | 192 µs | 182× |
Der letzte Wert ist am extremsten: Nur HTML-Struktur geändert, keine neuen CSS-Klassen – v4 landet im Mikrosekunden-Bereich, praktisch nicht spürbar.
Daten aus einem Produktionsprojekt (500+ Komponenten):
| Metrik | v3.4 | v4.0 | Änderung |
|---|---|---|---|
| Kaltstart-Build | 12,3 s | 1,8 s | 85 % schneller |
| Dev-Server-Start | 4,2 s | 0,8 s | 81 % schneller |
| HMR-Update | 340 ms | 12 ms | 96 % schneller |
| Produktions-CSS | 48 KB | 31 KB | 35 % kleiner |
| Speicher | 180 MB | 45 MB | 75 % weniger |
HMR von 340 ms auf 12 ms verändert den Dev-Alltag spürbar – früher eine deutliche Pause, heute praktisch sofort.
Was Oxide richtig macht
Kern: Rust + Lightning CSS. Rust ist schnell, entscheidend ist aber die Architektur:
Einheitliche Toolchain. v3 hing an PostCSS, autoprefixer, cssnano … v4 baut das ein, nur noch Lightning CSS. Weniger Schritte, mehr Tempo.
Intelligente Content-Erkennung. Früher content-Array in tailwind.config.js. v4 liest .gitignore und Modulgraph, findet Dateien selbst. Weniger Config, schnellerer Scan.
Native CSS-Features. Echte @layer-Regeln, @property, color-mix() – vom Browser nativ, ohne Compile-Zwischenschritt.
Die Details musst du nicht auswendig kennen. Ergebnis: schnellere Builds, weniger Config, besseres Dev-Erlebnis.
CSS-first-Konfiguration – Abschied von tailwind.config.js
Der größte Wandel in v4 – und der teuerste Teil der Migration.
Früher tailwind.config.js, jetzt @theme in CSS. Ungewohnt, wenn du jahrelang JS-Config gewohnt warst – nach einer Weile passt es besser zur CSS-Denkweise.
Konfigurations-Migration: Before & After
Einfachstes Beispiel – eigene Primärfarbe:
// v3: tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: '#3b82f6',
},
},
},
}
In v4 alles in CSS:
/* v4: app.css */
@import "tailwindcss";
@theme {
--color-primary: #3b82f6;
}
primary wird zu --color-primary – v4 hat strikte Präfix-Regeln.
Variablen-Namensregeln
| v3-Konfiguration | v4-CSS-Variablen-Präfix | Beispiel |
|---|---|---|
| colors | —color-* | —color-primary: #3b82f6 |
| spacing | —spacing-* | —spacing-128: 32rem |
| fontSize | —text-* | —text-xs: 0.75rem |
| fontFamily | —font-* | —font-sans: “Inter” |
| borderRadius | —radius-* | —radius-lg: 0.5rem |
| screens | —breakpoint-* | —breakpoint-md: 768px |
| boxShadow | —shadow-* | —shadow-card: 0 4px 12px rgba(0,0,0,0.1) |
| animation | —animate-* | —animate-spin: spin 1s linear infinite |
Am Anfang wirkt das umständlich – Vorteil: vorhersagbare Namen. Schriftgröße? Immer --text-*.
Komplexeres Beispiel
v3-Konfiguration:
// v3: tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
brand: {
light: '#f0f9ff',
DEFAULT: '#0ea5e9',
dark: '#0369a1',
},
},
fontFamily: {
display: ['Cal Sans', 'sans-serif'],
},
animation: {
'fade-in': 'fadeIn 0.5s ease-out',
},
},
},
plugins: [
require('@tailwindcss/typography'),
],
}
Migration nach v4:
/* v4: app.css */
@import "tailwindcss";
@theme {
/* Farben */
--color-brand-light: #f0f9ff;
--color-brand: #0ea5e9;
--color-brand-dark: #0369a1;
/* Schriftarten */
--font-display: "Cal Sans", sans-serif;
/* Animationen */
--animate-fade-in: fadeIn 0.5s ease-out;
}
/* Plugins */
@plugin "@tailwindcss/typography";
Wichtige Änderungen:
- Farben flach. v3:
brand.lightverschachtelt; v4:--color-brand-light - Plugins via @plugin. Kein JS-
requiremehr - Kein DEFAULT-Suffix. Standardfarbe:
--color-brand
Dark-Mode-Konfiguration
v3:
// v3
module.exports = {
darkMode: 'class', // oder 'media'
}
v4 default: media (System). Für class in CSS:
/* v4 */
@import "tailwindcss";
@variant dark (&:where(.dark, .dark *));
Bedeutung: Dark-Mode-Styles, wenn Element oder Vorfahre .dark hat.
Content-Erkennung
Früher manuell:
// v3
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx}',
'./public/index.html',
],
}
v4 liest .gitignore, ignoriert Ausgeschlossenes, scannt den Rest. Sonderstruktur? @source:
/* v4 */
@import "tailwindcss";
@source "../node_modules/my-ui-lib";
Vorteil CSS-first: Styling-Config in einer CSS-Datei, kein Springen zwischen JS und CSS. Nachteil: Umstellungsphase für JS-Config-Gewohnte.
Installation und Integration – Zero-Setup
Tailwind v3: drei Pakete, Config-Datei, PostCSS, content-Array … v4 reduziert das drastisch.
Minimal-Installation
Mit Vite zwei Schritte:
# 1. Installieren
npm install tailwindcss @tailwindcss/vite
# 2. Eine Zeile in vite.config.js
import tailwindcss from '@tailwindcss/vite'
export default {
plugins: [tailwindcss()],
}
In der CSS-Datei:
/* app.css oder index.css */
@import "tailwindcss";
Das war’s. Kein tailwind.config.js, kein postcss.config.js, kein content-Array.
Drei Integrationswege
Vite (empfohlen):
npm install tailwindcss @tailwindcss/vite
// vite.config.js
import tailwindcss from '@tailwindcss/vite'
export default {
plugins: [tailwindcss()],
}
PostCSS:
npm install tailwindcss @tailwindcss/postcss
// postcss.config.js
export default {
plugins: {
'@tailwindcss/postcss': {},
},
}
CLI:
npx tailwindcss -i input.css -o output.css --watch
Meist reicht Vite. PostCSS für Legacy-Migration, CLI ohne Build-Pipeline.
Automatische Content-Erkennung
Kein content-Array: v4 findet Dateien selbst.
Es liest .gitignore, schließt node_modules, dist usw. aus, sucht Tailwind-Klassen in den übrigen Dateien.
Voraussetzung: typische Node.js-Projektstruktur. Templates außerhalb des Projekts? Manuell:
@import "tailwindcss";
@source "../templates"; /* Scan-Pfad manuell */
Bonus: neue Dateien brauchen keine Config-Updates mehr.
Breaking Changes und Migrations-Checkliste
Kern der Migration. Die meisten Änderungen folgen Mustern; npx @tailwindcss/upgrade hilft stark mit.
Transparenz-Modifier
Größter Eingriff. v3 Hintergrund-Transparenz:
<!-- v3 -->
<div class="bg-blue-500 bg-opacity-50">...</div>
v4 in der Farbe:
<!-- v4 -->
<div class="bg-blue-500/50">...</div>
Gilt für alle Farb-Utilities:
<!-- Text-Transparenz -->
<p class="text-gray-900/75">...</p>
<!-- Rand-Transparenz -->
<div class="border-red-500/30">...</div>
bg-opacity-*? Entfernen – v4 unterstützt sie nicht.
Umbenannte Utilities
| v3-Klasse | v4-Klasse | Hinweis |
|---|---|---|
flex-grow | grow | Kürzer |
flex-grow-* | grow-* | Kürzer |
flex-shrink | shrink | Kürzer |
flex-shrink-* | shrink-* | Kürzer |
overflow-ellipsis | text-ellipsis | Kategorisierung |
decoration-slice | box-decoration-slice | Kategorisierung |
shadow-sm | shadow-xs | Größen-Umbenennung |
shadow | shadow-sm | Größen-Umbenennung |
rounded-sm | rounded-xs | Größen-Umbenennung |
rounded | rounded-sm | Größen-Umbenennung |
outline-none | outline-hidden | Semantik |
Achtung shadow/rounded: früheres shadow → shadow-sm, früheres shadow-sm → shadow-xs.
Default-Änderungen
Können visuelle Abweichungen erzeugen:
border-Default: v3 gray-200, v4 currentColor – Rand folgt Textfarbe.
<!-- v3: grauer Rand -->
<div class="border text-blue-500">Rand ist gray-200</div>
<!-- v4: Rand folgt Text -->
<div class="border text-blue-500">Rand ist blue-500</div>
ring-Default: v3 3px blue-500; v4 1px currentColor.
<!-- v3: blauer 3px-Ring -->
<button class="ring">...</button>
<!-- v4: currentColor 1px -->
<button class="ring">...</button>
<!-- v3-Effekt wiederherstellen -->
<button class="ring-3 ring-blue-500">...</button>
Vollständige Migrations-Checkliste
In dieser Reihenfolge:
-
Abhängigkeiten upgraden
npm install tailwindcss@latest @tailwindcss/vite@latest -
Automatisches Migrations-Tool
npx @tailwindcss/upgradeKonvertiert u. a.
@tailwind, Transparenz-Klassen, umbenannte Utilities. -
CSS-Einstieg umstellen
/* v3 */ @tailwind base; @tailwind components; @tailwind utilities; /* v4 */ @import "tailwindcss"; -
Config migrieren:
tailwind.config.js→@themein CSS. -
Plugins: JS →
@plugin.@plugin "@tailwindcss/typography"; -
Transparenz-Klassen: global nach
bg-opacity,text-opacity,border-opacitysuchen. -
Umbenannte Klassen:
shadow-*,rounded-*,flex-grow-*,flex-shrink-*. -
Defaults: border-Farbe und ring-Stil prüfen.
-
Visuelle Regression: Tests laufen lassen.
Das Tool erledigt ~80 %; die restlichen 20 % – besonders Default-Änderungen – brauchen manuelle Entscheidungen.
Neue Features – Container Queries, 3D Transforms & mehr
Neben Performance und Config kommen praktische Neuerungen.
Container Queries integriert
Früher Plugin, jetzt nativ:
<!-- Container definieren -->
<div class="@container">
<!-- Nach Containerbreite reagieren -->
<div class="@md:grid-cols-2 @lg:grid-cols-3">
...
</div>
</div>
@container ≈ container-type: inline-size; @md: ist Container-Breakpoint – ähnlich wie md:, mit @ davor.
Ideal für Komponentenbibliotheken: Layout nach Eltern-Container, nicht Viewport.
3D-Transform-Utilities
<!-- 3D-Perspektive -->
<div class="perspective-distant">
<!-- Rotation X -->
<div class="rotate-x-45">...</div>
</div>
<!-- Rotation Y -->
<div class="rotate-y-12">...</div>
<!-- Skalierung Z -->
<div class="scale-z-150">...</div>
Klassen u. a.: rotate-x-*, rotate-y-*, rotate-z-*, scale-z-*, perspective-*, translate-z-* – praktisch für Karten-Flip, 3D-Menüs.
@starting-style-Variante
Nutzt natives CSS @starting-style für Styles beim ersten Render:
<!-- Einblenden von transparent zu deckend -->
<div class="starting:opacity-0 opacity-100 transition-opacity">
...
</div>
Einblend-Animation ohne JavaScript – früher custom animate-fade-in, jetzt eine Klasse.
not-*-Variante
CSS :not():
<!-- Alle Kinder außer dem letzten -->
<li class="not-last:mb-4">...</li>
<!-- Buttons ohne disabled -->
<button class="not-disabled:opacity-100">...</button>
Direkter als Umwege über last:mb-0.
Erweiterte Gradient-API
<!-- Conic-Gradient -->
<div class="bg-conic/from-red-500 via-yellow-500 to-blue-500">...</div>
<!-- Radial-Gradient -->
<div class="bg-radial from-white to-transparent">...</div>
<!-- Interpolationsmodus -->
<div class="bg-linear-to-r from-blue-500 to-purple-500 via-oklch">...</div>
via-oklch: natürlichere Übergänge, besonders bei Farbraum-Konvertierung.
Fazit
Upgrade lohnenswert?
Bei aktiver Entwicklung: ja. HMR von Hunderten Millisekunden auf ~12 ms spart täglich Wartezeit. Kleineres CSS, weniger RAM – in großen Projekten besonders spürbar.
Migrationsaufwand: Config-Umstellung und Klassen-Änderungen. npx @tailwindcss/upgrade übernimmt vieles; mittleres Projekt (200+ Komponenten) ~ halber Tag inkl. Tests.
Neues Projekt? Direkt v4. Zero-Setup, Auto-Content, CSS-first – kein Grund zurückzubleiben.
Browser: Safari 16.4+, Chrome 111+, Firefox 128+. Alte Browser → Upgrade verschieben.
Empfehlungen:
- Neues Projekt: v4
- Bestehendes:
npx @tailwindcss/upgrade - border-Default und ring-Defaults prüfen
- Hilfe: offizielle Upgrade-Doku
Tailwind CSS v4 Migrationsleitfaden
Vollständige Schritte für das Upgrade von Tailwind v3 auf v4
⏱️ Estimated time: 30 min
- 1
Step 1: Abhängigkeiten upgraden
Mit npm auf die neueste Version upgraden:
```bash
npm install tailwindcss@latest @tailwindcss/vite@latest
```
Bei PostCSS-Integration stattdessen:
```bash
npm install tailwindcss@latest @tailwindcss/postcss@latest
``` - 2
Step 2: Automatisches Migrations-Tool ausführen
Tailwind bietet ein One-Click-Migrations-Tool:
```bash
npx @tailwindcss/upgrade
```
Das Tool übernimmt automatisch:
• @tailwind-Direktiven → @import "tailwindcss"
• Transparenz-Klassen von bg-opacity-* zur /50-Syntax
• Umbenannte Utilities (shadow-sm → shadow-xs usw.)
• Konfigurationsdatei in CSS-@theme-Format - 3
Step 3: CSS-Einstiegsdatei umstellen
Die drei @tailwind-Direktiven durch ein @import ersetzen:
```css
/* Diese entfernen */
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Ersetzen durch */
@import "tailwindcss";
``` - 4
Step 4: Eigene Konfiguration nach CSS migrieren
Theme-Konfiguration aus tailwind.config.js in die CSS-Datei verschieben:
```css
@import "tailwindcss";
@theme {
/* Farben */
--color-brand: #0ea5e9;
/* Schriftarten */
--font-display: "Cal Sans", sans-serif;
/* Animationen */
--animate-fade-in: fadeIn 0.5s ease-out;
}
```
Namensregeln: colors → --color-*, fontSize → --text-* - 5
Step 5: Plugin-Einbindung aktualisieren
JS-Plugins per @plugin-Direktive einbinden:
```css
/* Alt: in tailwind.config.js */
// plugins: [require('@tailwindcss/typography')]
/* Neu: in der CSS-Datei */
@plugin "@tailwindcss/typography";
``` - 6
Step 6: Default-Wert-Änderungen prüfen
Zwei Default-Änderungen besonders beachten:
• **border-Farbe**: von gray-200 zu currentColor
- Für den bisherigen grauen Rand explizit border-gray-200 setzen
• **ring-Default**: von 3px blue-500 zu 1px currentColor
- Für den bisherigen blauen 3px-Ring: ring-3 ring-blue-500 - 7
Step 7: Styles testen und korrigieren
Dev-Server starten und visuelle Änderungen prüfen:
```bash
npm run dev
```
Schwerpunkte:
• Transparenz-Styles korrekt?
• shadow- und rounded-Größen wie erwartet?
• Randfarben passen zum Design?
• Visuelle Regressionstests ausführen (falls vorhanden)
FAQ
Was ist der größte Unterschied zwischen Tailwind CSS v4 und v3?
Wie lange dauert die Migration auf Tailwind v4?
Welche Browser-Kompatibilität verlangt v4?
Was kann das automatische Migrations-Tool?
Braucht v4 noch ein content-Array?
Was tun bei inkonsistenten Styles nach dem v3-Upgrade?
Welche v4-Neuerungen sind besonders relevant?
7 Min. Lesezeit · Veröffentlicht am: 25. März 2026 · Aktualisiert am: 9. Juli 2026
Tailwind & shadcn/ui in der Praxis
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
Tailwind v4 + Vite: 5-Minuten-Setup-Vorlage und Verzeichnisstruktur
Tailwind CSS v4 mit Vite von Grund auf einrichten – komplette 5-Minuten-Vorlage und empfohlene Verzeichnisstruktur. Inklusive v3-zu-v4-Migrations-Checkliste für ein modernes Frontend-Projekt.
Teil 1 von 14
Nächster
Was ist shadcn/ui? Vergleich und Auswahl: shadcn/ui vs. MUI, Chakra & Ant Design
Tiefgehender Vergleich von shadcn/ui, Material-UI, Chakra UI und Ant Design – sieben Dimensionen von Bundle-Größe über Anpassbarkeit, Developer Experience und Barrierefreiheit bis zur Entscheidungshilfe
Teil 3 von 14
Ähnliche Beiträge
shadcn/ui Installation und Theme-Anpassung: Der vollständige Leitfaden (inkl. CSS-Variablen)

shadcn/ui Installation und Theme-Anpassung: Der vollständige Leitfaden (inkl. CSS-Variablen)
Admin-Skeleton mit shadcn/ui: Sidebar + Layout – Best Practices


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen