Lekce 4 — Nářadí: npm, Vite a Tailwind
Webové aplikace · navazuje na lekci 3 (CSS)
Zatím jste web dělali tak, jak se dělal před dvaceti lety: složka, v ní index.html a styl.css, dvojklik a prohlížeč to zobrazí. Pořád to funguje a pořád je to dobrý způsob, jak se učit. Skutečné webové projekty ale vypadají jinak. Stojí na stovkách balíčků, které napsal někdo jiný, a na nástrojích, které běží celou dobu, co na projektu pracujete.
Dnešní lekce je hlavně o nářadí. Nainstalujete si ho, naučíte se ho spouštět a vyzkoušíte si na něm Tailwind — jeden z nejpoužívanějších způsobů, jak dnes psát CSS. Kódu napíšete málo. Změní se hlavně to, jak s ním pracujete.
1. Node.js a npm
JavaScript je programovací jazyk, který běží v prohlížeči. Zatím jste ho nepotkali, ale potkáte. Před lety někdo vzal JavaScript z prohlížeče a udělal z něj program, který běží přímo na počítači, bez prohlížeče — to je Node.js. Skoro všechny nástroje pro webaře jsou napsané v JavaScriptu, takže ke spuštění potřebují Node.
npm (Node Package Manager) je program, který se nainstaluje s Node a umí stahovat balíčky. Balíček je kus kódu, který někdo napsal a zveřejnil, aby ho mohli používat ostatní. Na npmjs.com jich jsou miliony. Představte si obchod s aplikacemi v mobilu, jen místo aplikací jsou tam stavební díly pro programy.
Dnes JavaScript psát nebudete. Node vám jen spustí nástroje.
Instalace (jednou na počítač): na nodejs.org stáhněte verzi označenou LTS (Long Term Support — stabilní, podporovaná roky) a nainstalujte s výchozím nastavením. Pak to ověřte, viz kapitola 2.
2. Terminál
Nástroje pro webaře nemají okna a tlačítka. Ovládají se příkazy, které píšete do terminálu. Ve VS Code ho otevřete v menu Terminal → New Terminal. Objeví se dole pod editorem.
Napište tam tyhle dva příkazy, po každém Enter:
node -v
npm -v
Čísla se u vás můžou lišit. Důležité je, že tam nějaká čísla jsou a že první začíná aspoň v22. Když místo toho vidíte chybu, čtěte dál.
Na začátku řádku terminálu je vždycky vidět složka, ve které právě jste, třeba PS C:\projekty\moje-stranka>. Na tom záleží: příkazy se vztahují k téhle složce.
npm. Dvě řešení, vyberte si jedno:
- Přepnout terminál: v pravém horním rohu terminálu je šipka vedle
+. Vyberte Command Prompt a pracujte v něm. Funguje vždycky, i na školních počítačích. - Povolit skripty (na vlastním počítači): v terminálu jednou spusťte
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, potvrďte a otevřete nový terminál.
node vůbec nezná: zavřete a znovu otevřete celé VS Code. Terminál, který jste otevřeli před instalací Node, o něm neví.
3. Stažení základu
⬇ Stáhnout základ projektu (zip, 12 kB) Složkamoje-stranka s nastaveným Vite a Tailwindem. Bez node_modules — ty si stáhnete sami.
- Zip rozbalte (pravý klik → Extrahovat vše). Neotvírejte soubory přímo ze zipu — Windows je pak otevřou z dočasné složky a vaše změny se ztratí.
- Dejte složku někam, kde ji najdete, třeba do
C:\projekty\. - Ve VS Code: File → Open Folder a vyberte složku
moje-stranka— tu, ve které je přímopackage.json. - VS Code se možná zeptá, jestli souborům ve složce důvěřujete (Trust the authors) — ano. A vpravo dole možná nabídne doporučené rozšíření Tailwind CSS IntelliSense — nainstalujte ho, bude se hodit.
C:\projekty\) tenhle problém nemá.
Co ve složce najdete:
| soubor | co to je |
|---|---|
index.html | Vaše stránka. Tady budete dnes pracovat. |
src/styl.css | Styly. Zatím jen jeden řádek, který natáhne Tailwind. |
package.json | Popis projektu: jak se jmenuje, jaké balíčky potřebuje, jaké má příkazy. |
package-lock.json | Přesné verze všech balíčků. Nesahat. |
vite.config.js | Nastavení nástroje Vite. Dnes nesahat. |
README.md | Zkrácený návod. |
.gitignore, .vscode/ | Nastavení pro Git a VS Code. Zatím si jich nevšímejte. |
4. package.json — občanka projektu
{
"name": "moje-stranka",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"@tailwindcss/vite": "^4.3.3",
"tailwindcss": "^4.3.3",
"vite": "^8.3.1"
}
}
Tohle je formát JSON — dvojice "jméno": hodnota ve složených závorkách. Dvě části jsou důležité:
scripts— příkazy projektu.npm run devspustí to, co je u"dev", tedy programvite. Každý projekt si je pojmenuje sám, aledevabuildnajdete skoro všude.devDependencies— balíčky, které projekt potřebuje. „Dev“ znamená, že jsou potřeba jen při vývoji — jsou to nástroje, ne součást hotového webu. Hotový web je pak jen HTML a CSS.
Čísla verzí mají tři části: 8.3.1 = hlavní verze 8, menší verze 3, oprava 1. Změna první číslice znamená, že se něco může rozbít. Stříška v ^8.3.1 znamená „8.3.1 nebo novější, ale pořád osmička“.
package.json upravíte ručně a uděláte v něm chybu, npm odmítne pracovat s hláškou o JSON.parse. VS Code takovou chybu podtrhne červeně.
5. npm install — stáhni, co projekt potřebuje
npm install
npm přečetl package.json, stáhl balíčky z internetu a uložil je do nové složky node_modules. (Hláška o funding je jen prosba autorů o příspěvek, nic po vás nechce.) Podívejte se do node_modules. Chtěli jsme tři balíčky, a dostali jsme přes třicet a kolem 50 MB. Proč? Vite a Tailwind taky stojí na balíčcích jiných lidí, ty zase na dalších… Říká se tomu strom závislostí. Tenhle projekt je malý. Skutečná webová aplikace mívá v node_modules stovky balíčků a stovky megabajtů.
package-lock.json si pamatuje přesnou verzi každého z nich. Díky tomu má celá třída přesně stejné verze, jako mám já, a když to funguje mně, funguje to i vám.
npm install se spouští jednou po stažení projektu, a pak znovu, jen když se změní package.json.
npm error code ENOENT
npm error syscall open
npm error path C:\projekty\package.json
npm error enoent Could not read package.json
npm hledá package.json ve složce, ve které je terminál — a tam není. Podívejte se na cestu v chybě nebo na začátek řádku terminálu. Nejspíš jste ve VS Code otevřeli složku nad projektem (projekty místo moje-stranka), nebo rozbalením zipu vznikla složka ve složce. Otevřete správnou složku přes File → Open Folder.
node_modules nikam neposílejte
Nezabalujte ji do zipu, neposílejte mailem, nenahrávejte na Git ani na disk se školní prací. Je obrovská, má tisíce souborů — a je úplně zbytečná, protože kdokoliv si ji vyrobí sám přes npm install. Proto taky soubor .gitignore říká Gitu, ať si jí nevšímá. Smazat ji můžete kdykoliv; npm install ji postaví znovu.
6. npm run dev — vývojový server
npm run dev
Spustil se Vite — malý webový server, který běží na vašem počítači. Adresa localhost znamená „tenhle počítač“ a 5173 je číslo portu, na kterém server poslouchá. Podržte Ctrl a klikněte na adresu; otevře se prohlížeč s vaší stránkou.
Teď to hlavní: změňte v index.html text nadpisu a uložte (Ctrl+S). Prohlížeč se obnoví sám. Žádné F5, žádné Ctrl+F5. Vite hlídá soubory a každou uloženou změnu do prohlížeče hned pošle.
Dokud server běží, terminál je obsazený — na nic dalšího v něm nereaguje. Server zastavíte klávesou Ctrl+C. Když potřebujete spustit jiný příkaz a server nechat běžet, otevřete druhý terminál tlačítkem +.
localhost:5173 hlásí, že se nemůže připojit (ERR_CONNECTION_REFUSED), server neběží — zavřeli jste terminál, VS Code, nebo jste ho zastavili. Spusťte znovu npm run dev.A zkuste si schválně otevřít
index.html dvojklikem jako dřív. Stránka bude bez stylů. V styl.css je totiž jen @import "tailwindcss"; a tomu prohlížeč nerozumí. Na skutečné CSS to překládá až Vite. Takže od teď platí: stránka se otevírá přes server, ne dvojklikem. To je cena za nářadí.
7. Tailwind — CSS přímo v HTML
Podívejte se, jak je v index.html nastylovaná hlavička:
<header class="bg-slate-800 text-white px-6 py-4">
<h1 class="text-3xl font-bold">Moje stránka</h1>
Žádné pravidlo v styl.css. Místo toho má každý prvek hromadu malých tříd, a každá třída dělá právě jednu věc z CSS. V lekci 3 byste totéž napsali takhle:
header {
background-color: #1e293b; /* bg-slate-800 */
color: white; /* text-white */
padding: 16px 24px; /* px-6 py-4 */
}
Tailwind je balík tisíců takových hotových tříd. Vy je jen skládáte. Nejčastější:
| třída | CSS z lekce 3 |
|---|---|
p-4 | padding: 1rem (16 px) — ze všech stran |
px-6, py-4 | padding jen vlevo+vpravo (x), jen nahoře+dole (y) |
mt-2, mb-4 | margin-top, margin-bottom (t = top, b = bottom, l, r) |
mx-auto | margin-left i margin-right: auto — vycentrování |
max-w-3xl | max-width: 48rem (768 px) |
bg-white, bg-slate-800 | background-color |
text-white, text-sky-300 | color |
text-sm, text-xl, text-3xl | font-size (a k tomu vhodná výška řádku) |
text-center | text-align: center |
font-bold, font-semibold | font-weight |
border, border-t | rámeček 1 px — kolem dokola / jen nahoře |
border-slate-300 | barva rámečku |
rounded-lg | border-radius: 0.5rem |
flex gap-4 | položky vedle sebe s mezerou 1rem (podrobně příště) |
Velikosti mají stupnici: číslo × 4 px. p-1 = 4 px, p-4 = 16 px, p-8 = 32 px. Barvy mají jméno a odstín od 50 (skoro bílá) do 950 (skoro černá): slate-100 je světle šedá, slate-800 tmavě šedomodrá, sky-300 světle modrá. Celá paleta je na tailwindcss.com/docs/colors. A pozor: text- znamená podle toho, co následuje, buď velikost (text-xl), barvu (text-white), nebo zarovnání (text-center).
Předpony říkají, kdy třída platí:
hover:text-white— jen když je nad prvkem myš. V menu v základu to už je.md:text-3xl— jen na obrazovce široké aspoň 768 px (medium). Bez předpony platí třída všude, smd:ji na větších obrazovkách přebijete. Zápisclass="text-xl md:text-3xl"tedy znamená „na mobilu menší nadpis, na počítači větší“. Vyzkoušíte to zúžením okna, nebo v nástrojích prohlížeče (F12) klávesou Ctrl+Shift+M, která přepne na zobrazení jako na mobilu.
- Vzhled vidíte přímo u prvku. Nemusíte přepínat mezi dvěma soubory a hledat, které pravidlo se na prvek vztahuje.
- Nemusíte vymýšlet jména tříd (
.karta,.karta-velka,.karta-velka-modra…). - Ve výsledném CSS je jen to, co opravdu používáte. Smažete prvek a jeho styly zmizí s ním. U velkých webů to jinak nikdo neudělá, protože se nikdo neodváží smazat pravidlo z CSS — co kdyby ho ještě něco používalo.
class, které se hůř čtou, a opakování (karta má pět tříd a každá karta je musí mít všech pět). Ve světě se používají oba přístupy a uvidíte oba.Hlavně si odneste tohle: Tailwind není jiný jazyk, je to pořád CSS. Kdo neví, co je
padding, neví ani, co dělá p-4. Panel Styles v prohlížeči vám u každé třídy ukáže obyčejné CSS pravidlo, přesně jako v lekci 3. A sémantické HTML platí dál: header, nav a main zůstávají. Tailwind mění, jak píšete styly, ne co stránka znamená.
<h1> je stejně velký jako obyčejný text, seznamy nemají odrážky, odkazy nejsou modré ani podtržené, odstavce nemají mezery. Je to záměr: začínáte od nuly a co chcete, to si napíšete. Nadpis potřebuje text-3xl font-bold, seznam s odrážkami list-disc pl-6. Druhý <article> v základu vypadá tak nijak právě proto.
bg-blu-500, text-centre, p-4px — nic z toho neexistuje a Tailwind vám to neřekne. Třída se prostě neprojeví, stejně jako špatné CSS v lekci 3. Obrana:
- Tailwind CSS IntelliSense ve VS Code: když píšete do
class="", nabízí třídy, ukazuje barvy a po najetí myší na třídu ukáže, jaké CSS z ní vznikne. Když ukázat nic nemá, třída neexistuje. - Panel Styles v prohlížeči: když u prvku pravidlo pro vaši třídu vůbec není, třída neexistuje.
- Dokumentace na tailwindcss.com/docs má vyhledávání. Napište tam CSS vlastnost, kterou znáte (
padding,text-align), a dostanete tabulku odpovídajících tříd.
Obyčejné CSS psát pořád můžete. Cokoliv dáte do src/styl.css pod řádek s @import, funguje přesně jako v lekci 3. Obojí jde dohromady.
8. Přidání balíčku: vlastní písmo
Zatím jste jen instalovali, co projekt už měl. Teď přidáte balíček sami — písmo Inter, které umí i českou diakritiku:
npm install @fontsource-variable/inter
Podívejte se do package.json. Přibyla nová sekce, dependencies bez dev. Písmo totiž není nástroj na vývoj. Bude součástí hotového webu a návštěvník ho bude stahovat.
V src/styl.css písmo připojte a řekněte Tailwindu, ať ho používá jako výchozí:
@import "tailwindcss";
@import "@fontsource-variable/inter";
@theme {
--font-sans: "Inter Variable", sans-serif;
}
@theme je místo, kde se Tailwindu mění výchozí hodnoty — písmo, barvy, velikosti. Uložte a podívejte se do prohlížeče.
9. npm run build — hotový web
Vývojový server je pro vás, ne pro návštěvníky. Když je web hotový, zastavte server (Ctrl+C) a spusťte:
npm run build
Vznikla složka dist (distribution). Je v ní hotový web: obyčejné HTML a CSS, které by se nahrálo na skutečný server. Otevřete si to CSS:
- Je na jednom dlouhém řádku a bez mezer — zbytečné znaky Vite vyhodil, aby byl soubor menší.
- Má jen kolem 6 kB. Tailwind má tisíce tříd, ale do
distse dostaly jen ty, které na stránce opravdu používáte. - Divná písmena ve jménu (
index-wDGxWBxt.css) se změní pokaždé, když se změní obsah. Pamatujete si z lekce 3, že si prohlížeč staré CSS drží v mezipaměti a vy musíte mačkat Ctrl+F5? Tohle je řešení: nová verze má nové jméno, a prohlížeč tak nemůže použít starou.
Hotový web si prohlédnete příkazem npm run preview (adresa bude http://localhost:4173). Dvojklik na dist/index.html nefunguje ze stejného důvodu jako v pasti č. 4.
Pro přehled:
| příkaz | kdy |
|---|---|
npm install | jednou po stažení projektu; a znovu, když se změní package.json |
npm install jmeno-balicku | když chcete přidat balíček |
npm run dev | pokaždé, když začínáte pracovat |
npm run build | když chcete hotový web do dist |
npm run preview | když se chcete na hotový web podívat |
| Ctrl+C | zastavit server |
npm create vite@latest se zeptá na jméno a pár dalších věcí a vyrobí kostru projektu. Do ní se pak přidal Tailwind podle návodu na tailwindcss.com a vyhodilo se, co jsme nepotřebovali. Na začátek je lepší dostat základ, o kterém víte, že funguje. Až se v nástrojích vyznáte, zkuste si to sami.
10. Úkoly
Odevzdává se složka projektu zabalená do zipu, bez node_modules a bez dist. Já si ji rozbalím, spustím npm install a npm run dev, a musí to fungovat.
Rozjeďte to
Nainstalujte Node, rozbalte základ, npm install, npm run dev. Změňte nadpis na své jméno, uložte a sledujte, jak se prohlížeč obnoví sám.
Pak se podívejte, jak velká je složka node_modules (pravý klik → Vlastnosti). Zastavte server, node_modules smažte, spusťte npm install a npm run dev znovu. Funguje to? Teď už víte, proč se nikam neposílá.
Druhá karta a patička
V index.html jsou dvě místa označená ÚKOL. Druhý <article> má vypadat stejně jako ten první. Patička: menší písmo, šedý text, na střed, nahoře tenká čára a kolem trochu místa.
Třídy na patičku hledejte v dokumentaci nebo přes IntelliSense, ne v hotovém řešení od kamaráda nebo AI. Jde o to naučit se je najít.
Vaše stránka v Tailwindu
Vezměte svou stránku z lekce 3 a přestěhujte ji do projektu: obsah <body> zkopírujte do index.html místo vzorového obsahu. Starý <link> na styl.css z lekce 3 nepotřebujete.
Pak projděte svoje staré CSS pravidlo po pravidle a každou deklaraci převeďte na třídu Tailwindu. Sémantická struktura (header, nav, main, section, article, footer) musí zůstat. Výsledek by měl vypadat skoro stejně jako dřív.
Otázka: který zápis se vám čte líp, ten z lekce 3, nebo tenhle? Budu se ptát a obě odpovědi jsou správné, když je umíte zdůvodnit.
Na mobilu i na počítači
Na úzké obrazovce ať jsou položky menu pod sebou a nadpis menší. Od šířky md výš ať jsou položky vedle sebe a nadpis velký jako teď.
Nápověda: flex-col skládá položky pod sebe, flex-row vedle sebe. Na mobil nepište předponu, na počítač md:. Výsledek kontrolujte přes Ctrl+Shift+M v nástrojích prohlížeče.
Vlastní písmo a build
Na fontsource.org si vyberte jiné písmo než Inter. Musí umět latin-ext, jinak nezobrazí háčky a čárky. Nainstalujte ho a nastavte jako výchozí podle kapitoly 8. Zkontrolujte, že se zobrazuje „ěščřžýáíé“ — a hlavně ve vašem písmu, ne v záložním.
Pak npm run build a prozkoumejte dist/assets. Souborů s písmem je tam několik (latin, latin-ext, cyrillic…). Proč? Stahuje prohlížeč všechny? Zjistěte to v nástrojích prohlížeče, záložka Network, na stránce z npm run preview.
Shrnutí — co byste měli umět říct vlastními slovy
- Co je Node.js, co je npm a co je balíček.
- K čemu je
package.jsona k čemupackage-lock.json. - Co je
node_modules, proč je tak velká a proč se nikam neposílá. - Rozdíl mezi
dependenciesadevDependencies. - Co dělá
npm run deva proč stránka najednou nefunguje dvojklikem. - Co znamenají třídy
p-4,mx-auto,text-xlamd:text-3xl— jako CSS z lekce 3. - Proč Tailwind dává styly do HTML, když jsme minule říkali, že tam nepatří — a co to stojí.
- Co je ve složce
dista proč má CSS soubor divné jméno.
node_modules?“.A dnes jedna zvláštní past: znalosti AI mají datum. Tailwind 4 se nastavuje úplně jinak než Tailwind 3, a spousta AI i návodů na internetu pořád radí tu starou cestu. Když vám někdo řekne, ať vytvoříte
tailwind.config.js, spustíte npx tailwindcss init nebo napíšete @tailwind base;, je to rada pro starou verzi a v tomhle projektu nefunguje. Jakou verzi máte, se dočtete v package.json. Vždycky si zkontrolujte, pro jakou verzi rada je.