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
v24.15.0 11.12.1

Čí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.

Past č. 1: „running scripts is disabled on this system“ Na Windows se ve VS Code terminálu často spouští PowerShell a ten má ve výchozím nastavení zakázané skripty — včetně npm. Dvě řešení, vyberte si jedno: A když terminál hlásí, že 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žka moje-stranka s nastaveným Vite a Tailwindem. Bez node_modules — ty si stáhnete sami.
  1. 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í.
  2. Dejte složku někam, kde ji najdete, třeba do C:\projekty\.
  3. Ve VS Code: File → Open Folder a vyberte složku moje-stranka — tu, ve které je přímo package.json.
  4. 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.
Ne na OneDrive Plochu a Dokumenty Windows často synchronizují na OneDrive. Za chvíli se do projektu stáhnou tisíce malých souborů a OneDrive je začne všechny nahrávat — počítač se zpomalí a npm občas spadne, protože mu OneDrive soubory zamyká. Složka mimo OneDrive (třeba C:\projekty\) tenhle problém nemá.

Co ve složce najdete:

souborco to je
index.htmlVaše stránka. Tady budete dnes pracovat.
src/styl.cssStyly. Zatím jen jeden řádek, který natáhne Tailwind.
package.jsonPopis projektu: jak se jmenuje, jaké balíčky potřebuje, jaké má příkazy.
package-lock.jsonPřesné verze všech balíčků. Nesahat.
vite.config.jsNastavení nástroje Vite. Dnes nesahat.
README.mdZkrá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é:

Čí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“.

JSON je přísný Klíče i texty v dvojitých uvozovkách, za poslední položkou žádná čárka, žádné komentáře. Když 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
added 32 packages, and audited 33 packages in 6s 11 packages are looking for funding run `npm fund` for details found 0 vulnerabilities

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.

Past č. 2: špatná složka
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.
Past č. 3: 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.
Instalace balíčku = spuštění cizího kódu Každý balíček napsal někdo, koho neznáte, a npm jeho kód stáhne a spustí na vašem počítači. Většina lidí je slušná. Ale útočníci zkoušejí zveřejňovat balíčky se jménem, které se od známého liší jedním písmenkem, a čekají na překlep. Instalujte jen balíčky, o kterých víte, co jsou, a jejich jméno opisujte pečlivě.

6. npm run dev — vývojový server

npm run dev
VITE v8.3.1 ready in 241 ms ➜ Local: http://localhost:5173/ ➜ Network: use --host to expose ➜ press h + enter to show help

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 +.

Past č. 4: „Tento web je nedostupný“ a stránka bez stylů Když prohlížeč na 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řídaCSS z lekce 3
p-4padding: 1rem (16 px) — ze všech stran
px-6, py-4padding jen vlevo+vpravo (x), jen nahoře+dole (y)
mt-2, mb-4margin-top, margin-bottom (t = top, b = bottom, l, r)
mx-automargin-left i margin-right: auto — vycentrování
max-w-3xlmax-width: 48rem (768 px)
bg-white, bg-slate-800background-color
text-white, text-sky-300color
text-sm, text-xl, text-3xlfont-size (a k tomu vhodná výška řádku)
text-centertext-align: center
font-bold, font-semiboldfont-weight
border, border-trámeček 1 px — kolem dokola / jen nahoře
border-slate-300barva rámečku
rounded-lgborder-radius: 0.5rem
flex gap-4polož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í:

„Počkat, minule jsme si říkali, že vzhled do HTML nepatří!“ Říkali. A Tailwind to pravidlo porušuje schválně. Proč to lidi dělají: A co to stojí: dlouhé atributy 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á.
Past č. 5: proč je můj nadpis malý? Tailwind na začátku vynuluje výchozí vzhled prohlížeče. <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.
Past č. 6: překlep ve třídě 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:

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
dist/index.html 2.14 kB │ gzip: 0.92 kB dist/assets/index-wDGxWBxt.css 6.52 kB │ gzip: 2.08 kB ✓ built in 99ms

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:

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říkazkdy
npm installjednou po stažení projektu; a znovu, když se změní package.json
npm install jmeno-balickukdyž chcete přidat balíček
npm run devpokaždé, když začínáte pracovat
npm run buildkdyž chcete hotový web do dist
npm run previewkdyž se chcete na hotový web podívat
Ctrl+Czastavit server
Pro zvědavé: jak vznikl základ Nikdo takový projekt nepíše ručně. Příkaz 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.

Úkol 1 · zahřívací

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á.

Úkol 2

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.

Úkol 3

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.

Úkol 4

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.

Úkol 5 · pro rychlé

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

Pravidlo pro AI platí pořád: ptejte se, nechte si vysvětlit chybu z terminálu (vložte ji celou, i s cestou), nechte si poradit, která třída Tailwindu odpovídá vaší CSS vlastnosti. U kontroly ale dostanete otázky jako „zvětši mezeru mezi kartami“ nebo „co se stane, když smažu 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.