Tailwind CSS v4

Instalace pro Express i Next.js, vlastní design a rozdělení CSS - krok za krokem

Praktický návod pro Tailwind 4 ve dvou prostředích: Express (Tailwind CLI) a Next.js (PostCSS). Od instalace přes vlastní barvy a fonty až po samostatné CSS pro web, administraci nebo jednotlivé stránky - včetně postupu, který používáme na tomto webu. Příkazy a soubory zkopírujete jedním kliknutím.

Vladimír NeporAutorIng. Vladimír Nepor
Publikováno
Jak Tailwind CSS v4 vytvoří CSS: ze tříd v šablonách a komponentách přes vstupní CSS a CLI nebo PostCSS vznikne soubor jen s použitými třídamiŠablony a komponentyviews/*.hbsapp/**/*.tsx*.html · *.phptřídy v class / classNamesrc/input.css@import "tailwindcss";@theme { … }@source "…";CLI / PostCSSExpress · Next.js · Vitepublic/css/style.cssJen použité třídyminifikované CSS02 · INSTALACEExpress (Tailwind CLI)4 kroky, skripty --watch a --minifykapitola →02 · INSTALACENext.js (PostCSS)3 kroky, build řeší frameworkkapitola →04 · VLASTNÍ DESIGNBarvy, fonty, komponenty@theme, next/font, @utilitykapitola →05 · ROZDĚLENÍ CSSČásti webu a stránkyweb × admin, styly jedné stránkykapitola →
Obsah návodu

00 · Přehled

Tailwind CSS v kostce

Tailwind CSS vygeneruje z tříd, které napíšete do šablon nebo komponent (class="p-4 bg-white rounded-xl"), jeden malý CSS soubor - jen s tím, co web opravdu používá. Ve verzi 4 na to stačí jeden řádek CSS, bez konfiguračního souboru. Liší se jen to, kdo CSS sestaví: v Express samostatný nástroj CLI, v Next.js samotný framework.

Kterou integraci zvolit

ProjektIntegraceBalíčky
Express, PHP, statické HTML, Django… (bez bundleru)Tailwind CLItailwindcss @tailwindcss/cli
Next.jsPostCSStailwindcss @tailwindcss/postcss postcss
Vite, Astro, SvelteKit, Nuxt…Vite plugintailwindcss @tailwindcss/vite

Vstupní CSS, vlastní design (@theme, @utility) i výběr zdrojů přes @source fungují ve všech integracích stejně. Kde se postup liší (instalace, build, rozdělení CSS), přepnete si v záložkách mezi Express a Next.js - volba platí pro celý návod.

Celý postup ve zkratce

  1. Nainstalujte balíčky - podle integrace v tabulce výše
  2. Vytvořte vstupní CSS - soubor s řádkem @import "tailwindcss";
  3. Napojte build - Express: skripty s CLI v package.json · Next.js: postcss.config.mjs
  4. Načtěte CSS - Express: <link> v layoutu · Next.js: import "./globals.css" v app/layout.tsx

Co řešíte?

OtázkaKde najdete odpověď
Co se ve v4 změnilo oproti v3?Jak Tailwind v4 funguje →
Mám Express (nebo jiný server bez bundleru).Instalace pro Express →
Mám Next.js.Instalace pro Next.js →
Jak spustit vývoj a produkční build?Build a nasazení →
Chci vlastní barvy, fonty nebo komponenty (tlačítka).Vlastní design →
Web a administrace mají mít každý vlastní CSS.Rozdělení CSS →
Jedna stránka potřebuje hodně vlastních stylů (Next.js).Styly jen pro jednu stránku →
Třída v šabloně se neprojevuje.Řešení problémů →
Pro jakou verzi návod platí

Tailwind CSS 4.x (ověřeno na řadě 4.3), Node.js 20 nebo novější. Příklady: Express 5 s Handlebars a Next.js 15+ s App Routerem. Postup pro Express platí stejně pro PHP, Twig nebo statické HTML.

01 · Princip

Jak Tailwind v4 funguje

Tailwind projde soubory projektu, najde v nich názvy tříd a pro každou použitou třídu vygeneruje CSS pravidlo. Nepoužité třídy ve výsledném souboru nejsou, takže i velký web má typicky jen desítky kB CSS.

Co je ve v4 jinak než ve v3

Pokud znáte Tailwind 3, většina starých návodů už neplatí. Nejdůležitější změny:

Tailwind 3Tailwind 4
Vstupní CSS@tailwind base; @tailwind components; @tailwind utilities;@import "tailwindcss";
Konfiguracetailwind.config.jspřímo v CSS: @theme, @utility, @source
Které soubory se prohledajíručně v poli contentautomaticky celý projekt (kromě .gitignore a node_modules), upřesnění přes @source
CLInpx tailwindcss (součást balíčku)samostatný balíček @tailwindcss/cli
PostCSS plugintailwindcss + autoprefixer@tailwindcss/postcss (prefixy a importy řeší sám)
Inicializacenpx tailwindcss initnení potřeba (příkaz neexistuje)
Safelist (vždy vygenerovat)pole safelist@source inline("…")
Pluginypole plugins v configu@plugin "@tailwindcss/typography";
Podpora prohlížečů

Tailwind 4 stojí na moderním CSS (kaskádové vrstvy, @property, color-mix()) a vyžaduje Safari 16.4+, Chrome 111+ a Firefox 128+. Pokud musíte podporovat starší prohlížeče, zůstaňte u Tailwind 3.4.

Přechod existujícího projektu z v3

Většinu práce udělá oficiální nástroj - převede závislosti, vstupní CSS, konfiguraci i PostCSS a upraví přejmenované třídy v šablonách. Spusťte ho v nové větvi a výsledek zkontrolujte:

Terminál
npx @tailwindcss/upgrade
Zapamatujte si
  • Ve v4 se vše nastavuje v CSS, tailwind.config.js ani init nepotřebujete.
  • Výsledné CSS obsahuje jen třídy, které Tailwind v souborech skutečně našel.
  • Návody pro v3 (@tailwind base, pole content, tailwindcss jako PostCSS plugin) ve v4 nefungují.

02 · Instalace

Instalace krok za krokem

Vyberte své prostředí. Volba se zapamatuje a přepne i záložky v kapitolách Build a Rozdělení CSS.

Kde není bundler, sestaví CSS samostatný nástroj Tailwind CLI a výsledek uloží jako obyčejný soubor do public/. Čtyři kroky pro Node.js aplikaci s Express a Handlebars - stejně to funguje pro PHP, Twig nebo statické HTML.

Předpoklady

  • Node.js 20 nebo novější (doporučujeme aktuální LTS)
  • express 5 (npm install express)
  • express-handlebars 8 (npm install express-handlebars)

Příklady počítají s touto strukturou projektu (složky si můžete pojmenovat jinak, jen pak upravte cesty v příkazech):

Struktura projektu
muj-projekt/
├── app.js
├── package.json
├── src/
│   └── input.css        ← vstup pro Tailwind (píšete vy)
├── public/
│   └── css/style.css    ← výstup (generuje Tailwind, needitovat)
└── views/
    ├── layouts/main.hbs
    ├── partials/
    └── home.hbs

Krok 1: Nainstalujte Tailwind a CLI

V kořenové složce projektu:

Terminál
npm install -D tailwindcss @tailwindcss/cli

-D uloží balíčky jako vývojové závislosti - CSS se sestaví předem a na serveru je potřeba jen hotový soubor. Pokud build spouštíte až na serveru po npm ci --omit=dev, instalujte bez -D.

Krok 2: Vytvořte vstupní CSS soubor

Soubor src/input.css s jediným řádkem:

src/input.css
@import "tailwindcss";

Víc není potřeba. Tailwind sám prohledá šablony a skripty v projektu (.hbs, .html, .js…) a vynechá soubory z .gitignore a node_modules. Vlastní barvy a fonty se přidávají sem do CSS - viz Vlastní design.

Krok 3: Přidejte skripty do package.json

Do sekce scripts vložte příkaz pro vývoj a pro produkční build:

package.json
"scripts": {
  "dev:css": "npx @tailwindcss/cli -i ./src/input.css -o ./public/css/style.css --watch",
  "build:css": "npx @tailwindcss/cli -i ./src/input.css -o ./public/css/style.css --minify"
}

-i je vstupní soubor, -o výstupní. --watch nechá proces běžet a přegeneruje CSS při každé změně, --minify výsledek zmenší pro produkci.

Krok 4: Připojte vygenerované CSS

Express musí složku public servírovat jako statické soubory a layout na CSS odkázat:

app.js
app.use(express.static("public"));
views/layouts/main.hbs
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="/css/style.css">
</head>

Teď můžete v šablonách psát třídy, např. <h1 class="text-3xl font-bold text-green-700">, a po spuštění npm run dev:css se projeví (viz Build a nasazení).

03 · Build

Build a nasazení

Při vývoji se CSS přegenerovává samo po každé změně, před nasazením vznikne minifikovaná verze. V Express to řídí vaše skripty, v Next.js běžné příkazy frameworku.

PříkazCo dělá
Vývojnpm run dev:cssSestaví CSS a dál sleduje změny v šablonách. Ukončíte ho Ctrl+C.
Produkcenpm run build:cssSestaví jednou, minifikovaně. Spouští se před nasazením nebo v CI.
Spouštějte z kořene projektu

Tailwind hledá šablony od složky, ze které příkaz spouštíte. Když CLI spustíte odjinud, výsledné CSS bude skoro prázdné (viz Řešení problémů).

CSS a server zároveň

dev:css běží trvale, takže server spusťte ve druhém terminálu (node --watch app.js). Pokud chcete obojí jedním příkazem, použijte run-p z balíčku npm-run-all2 - viz Build všeho najednou.

Jeden soubor pro celý web

Výchozí nastavení vytvoří jeden globální CSS soubor pro všechny stránky. To je pro většinu webů správná volba: soubor je malý a prohlížeč ho stáhne jen jednou. Pokud máte části s úplně jiným vzhledem nebo stránky s rozsáhlými vlastními styly, můžete CSS rozdělit.

Zapamatujte si
  • Express: dev:css při práci, build:css před nasazením.
  • Next.js: nic navíc, stačí npm run dev a npm run build.
  • Vygenerovaný soubor v public/css/ needitujte ručně - při dalším buildu se přepíše.

04 · Vlastní design

Vlastní barvy, fonty a komponenty

Barvy, fonty, breakpointy i opakovaně používané komponenty se ve v4 definují přímo ve vstupním CSS (src/input.css v Express, app/globals.css v Next.js). Tailwind z nich automaticky vytvoří třídy, které fungují se všemi variantami (hover:, md:, dark:…).

Barvy, fonty a breakpointy: @theme

Každá proměnná v bloku @theme přidá sadu tříd. Z --color-brand vznikne bg-brand, text-brand, border-brand atd., z --font-display třída font-display, z --breakpoint-3xl varianta 3xl:.

CSS
@import "tailwindcss";

@theme {
  --color-brand: #00a94f;
  --color-brand-dark: #0f2a1d;
  --font-display: "Inter", sans-serif;
  --breakpoint-3xl: 120rem;
}

Next.js: fonty z next/font

next/font stáhne písmo při buildu a hostuje ho sám. Font zpřístupníte jako CSS proměnnou na <html> a v CSS ho napojíte na třídu font-sans:

app/layout.tsx
import { Inter } from "next/font/google";
import "./globals.css";

const inter = Inter({ subsets: ["latin", "latin-ext"], variable: "--font-inter" });

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="cs" className={inter.variable}>
      <body className="font-sans">{children}</body>
    </html>
  );
}
app/globals.css
@theme inline {
  --font-sans: var(--font-inter);
}

inline je tu důležité: proměnnou --font-inter nastavuje next/font až na elementu <html>, takže třída musí odkazovat přímo na ni. Pro češtinu nezapomeňte na latin-ext.

Opakovaně používané styly: @utility

Když se stejná kombinace tříd opakuje (tlačítka, štítky), vytvořte z ní vlastní třídu direktivou @utility. Funguje i s variantami, takže můžete psát md:btn-primary. Uvnitř lze použít @apply s běžnými třídami Tailwindu i proměnné z @theme. V Next.js (React) je často přirozenější udělat z opakovaného prvku komponentu - @utility se hodí hlavně pro šablony bez komponent.

CSS
@utility btn-primary {
  @apply inline-flex items-center rounded-lg px-4 py-2 font-semibold text-white;
  background-color: var(--color-brand);
}

Pro složitější komponenty, kde varianty nepotřebujete, můžete použít klasické CSS třídy v @layer components { … }. Běžné třídy Tailwindu je v HTML vždy přebijí.

Tmavý režim přepínaný třídou

Varianta dark: se ve výchozím stavu řídí nastavením systému. Pokud chcete režim přepínat tlačítkem (třídou dark na <html>), přepište variantu:

CSS
@custom-variant dark (&:where(.dark, .dark *));
Zapamatujte si
  • Design tokeny patří do @theme - třídy z nich vzniknou samy.
  • Proměnné z next/font napojte přes @theme inline.
  • Opakované kombinace tříd uložte jako @utility, v Reactu raději jako komponentu.

05 · Rozdělení CSS

Samostatné CSS pro části webu a stránky

Jeden CSS soubor stačí většině webů. Rozdělení má smysl, když mají části webu odlišný vzhled (typicky veřejný web a administrace), nebo když jednotlivé stránky potřebují rozsáhlé vlastní styly, které nechcete posílat na všechny ostatní stránky.

Princip: co se vygeneruje a kde se to načte

  • Které třídy se vygenerují - automatická detekce prohledává celý projekt, takže by každý soubor obsahoval třídy ze všech šablon. source(none) ji vypne a @source určí, které složky se mají prohledat (cesty relativně k CSS souboru). Funguje to stejně v CLI, PostCSS i Vite.
  • Kde se soubor načte - to řeší prostředí: v Express odkaz v layoutu, v Next.js import v layoutu skupiny rout nebo <link> v komponentě stránky.

Které řešení zvolit

SituaceŘešení
Malý a střední web s jednotným vzhledemJeden soubor (výchozí stav), nic neměnit
Web × administrace v Express, PHP…Více vstupů pro CLI (source(none) + @source)
Web × administrace v Next.jsSkupiny rout s vlastním kořenovým layoutem a vlastním CSS
Stránky s rozsáhlými vlastními styly (Next.js)Čisté CSS v public/ + <link precedence>
Složka, jejíž třídy nechcete v CSS (ukázky, archiv)@source not "../slozka";

Web × administrace: samostatný vstup pro každou část

Krok 1: Vytvořte vstupní CSS pro každou část

src/input/web.css
@import "tailwindcss" source(none);
@source "../../views/web";
@source "../../views/layouts";
@source "../../views/partials";
src/input/admin.css
@import "tailwindcss" source(none);
@source "../../views/admin";
@source "../../views/partials";

Sdílené šablony (layouty, partials) přidejte do každého souboru, který je používá. Společný @theme můžete dát do samostatného souboru (např. src/theme.css) a do obou vstupů ho načíst přes @import "../theme.css";.

Krok 2: Přidejte skripty pro každou část

Pro každou část jeden příkaz pro vývoj a jeden pro produkci:

package.json
"scripts": {
  "dev:web": "npx @tailwindcss/cli -i ./src/input/web.css -o ./public/css/web.css --watch",
  "dev:admin": "npx @tailwindcss/cli -i ./src/input/admin.css -o ./public/css/admin.css --watch",
  "build:web": "npx @tailwindcss/cli -i ./src/input/web.css -o ./public/css/web.css --minify",
  "build:admin": "npx @tailwindcss/cli -i ./src/input/admin.css -o ./public/css/admin.css --minify",
  "dev": "run-p dev:web dev:admin",
  "build": "run-p build:web build:admin"
}

Krok 3: Spouštějte všechny části najednou

Skripty dev a build výše používají run-p (paralelní běh) z balíčku npm-run-all2 - udržovaného nástupce původního npm-run-all se stejnými příkazy. Nainstalujte ho:

Terminál
npm install -D npm-run-all2

Pak stačí npm run dev při vývoji a npm run build před nasazením. Do dev můžete přidat i server, např. "dev": "run-p dev:web dev:admin server".

Krok 4: Připojte v každé části její CSS

Web odkazuje na /css/web.css, administrace na /css/admin.css. S express-handlebars to nejjednodušeji vyřešíte dvěma layouty (main.hbs a admin.hbs) a v routách administrace res.render("admin/dashboard", { layout: "admin" }).

Starý postup z v3 nefunguje

Návody pro v3 používají samostatné soubory tailwind.home.config.js s polem content a parametr CLI -c. Ve v4 pole content neexistuje a automatická detekce by do obou souborů zahrnula třídy ze všech šablon. Pokud JS konfiguraci přechodně potřebujete (např. kvůli pluginu), načtěte ji v CSS direktivou @config "../../tailwind.config.js"; - volby corePlugins, safelist a separator ale v4 nepodporuje.

Zapamatujte si
  • source(none) + @source = každý CSS soubor jen ze svých šablon (CLI, PostCSS i Vite).
  • Next.js: oddělené části = oddělené kořenové layouty, jinak se styly při navigaci sčítají.
  • Velké styly jedné stránky v Next.js: čisté CSS v public/ + <link precedence>.

06 · Problémy

Když se styl neprojeví

Nejčastější důvod, proč se styl neprojeví: Tailwind třídu v souborech nenašel jako celé slovo, a proto ji nevygeneroval.

PříznakPříčinaŘešení
Třída v šabloně nemá žádný stylNázev třídy se skládá dynamicky, např. class="bg-{{color}}-500" nebo `bg-${color}-500`Pište celé názvy (bg-red-500, bg-green-500) a vybírejte mezi nimi, nebo je vynuťte přes @source inline("bg-red-500 bg-green-500");
Třídy z některé složky chybíSložka je v .gitignore, nebo ji po rozdělení CSS nepokrývá žádný @sourcePřidejte @source "cesta/ke/slozce"; (cesta relativní k CSS souboru)
Výsledné CSS je skoro prázdné (CLI)Příkaz běží z jiné složky, než je kořen projektuSpouštějte z kořene, nebo nastavte základ: @import "tailwindcss" source("../");
Chyba u @tailwind base; nebo npx tailwindcss initSyntaxe a příkazy z Tailwind 3@import "tailwindcss";, CLI je npx @tailwindcss/cli, init ve v4 není
Next.js: „It looks like you're trying to use tailwindcss directly as a PostCSS plugin“V postcss.config zůstal zápis z v3Nainstalujte @tailwindcss/postcss a v configu použijte "@tailwindcss/postcss": {}
Next.js: CSS jedné stránky se načítá na všech stránkáchImport CSS v komponentě pod společnou routou nebo layoutemStyly stránky přes <link precedence>, oddělené části přes skupiny rout
Next.js: po přechodu do jiné části webu se styly míchajíPři navigaci na straně klienta Next.js načtené styly neodebíráOddělené kořenové layouty (přechod mezi nimi = plné načtení) a prefixy tříd ve vlastním CSS
Build zbytečně prochází velkou složkuAutomatická detekce prohledá vše, co není v .gitignoreVynechte ji: @source not "../legacy";
Na serveru build hlásí neznámý příkaz (CLI)Balíčky jsou v devDependencies a server instaluje npm ci --omit=devSestavte CSS předem (lokálně nebo v CI), nebo instalujte bez -D
Změna se v prohlížeči neprojevíNeběží dev:css / next dev, nebo prohlížeč drží starou verzi v cacheZkontrolujte terminál, obnovte stránku bez cache (Ctrl+F5), u souborů v public/ přidejte verzi do URL (style.css?v=2)

Zdroje

Oficiální dokumentace a další čtení

Potřebujete s webem pomoci?

Navrhneme a postavíme rychlý web nebo převedeme stávající projekt na Tailwind 4.

Rezervovat schůzku