
# Ukladanie do vyrovnávacej pamäte a minimalizácia

Na okraji kompilácie sú tri témy pre produkčné nasadenie: vyhnúť sa opätovnej kompilácii rovnakého vstupu, vyhnúť sa nákladom na zostavenie kompilátora pri každej požiadavke a zmenšiť vygenerované CSS. Všetky tri riešia pomocné funkcie na strane PHP okolo kompilátora.

## Ukladanie do vyrovnávacej pamäte

Generovanie CSS pri každom volaní spúšťa celý postup. Ak sa obsah medzi požiadavkami nemení, vyrovnávacia pamäť založená na súboroch uloží výsledok na disk a pri ďalších volaniach ho odtiaľ načíta.

Odovzdajte `cache` do `tw::generate()` — `true` pre predvolený adresár alebo reťazec s cestou pre vlastný adresár:

```php
use TailwindPHP\tw;

// Cache to the default directory: sys_get_temp_dir() . '/tailwindphp'
$css = tw::generate([
    'content' => '<div class="flex p-4">Hello</div>',
    'cache' => true,
]);

// Cache to a custom directory
$css = tw::generate([
    'content' => '<div class="flex p-4">Hello</div>',
    'cache' => '/path/to/cache',
]);

// With a time-to-live (seconds)
$css = tw::generate([
    'content' => '<div class="flex p-4">Hello</div>',
    'cache' => true,
    'cacheTtl' => 3600, // expire after 1 hour
]);
```

Adresár vyrovnávacej pamäte sa vytvorí automaticky, ak ešte neexistuje.

### Kľúč vyrovnávacej pamäte

Kľúč sa odvodzuje od **obsahu**, **CSS konfigurácie** a príznaku **minify** — tieto údaje sa zahashujú do názvu súboru `tailwind_<hash>.css`. Každá zmena značiek, CSS vstupu alebo zapnutia minifikácie vytvorí iný kľúč, a teda aj iný súbor.

CSS konfigurácia v kľúči pozostáva z inline `css` a obsahu súborov uvedených v `importPaths`. Dve položky do nej nepatria: súbory načítané vnoreným `@import` v týchto súboroch a verzia TailwindPHP. Po úprave vnoreného importu alebo aktualizácii balíka vymažte vyrovnávaciu pamäť, inak sa bude naďalej zobrazovať starý výstup.

### Čas platnosti

`cacheTtl` je životnosť v sekundách. Pri nájdení súboru vo vyrovnávacej pamäti sa porovná jeho čas poslednej úpravy s aktuálnym časom; ak je súbor starší ako `cacheTtl`, považuje sa za nenájdený a znova sa skompiluje. Bez `cacheTtl` záznamy nikdy neexpirujú — vymažte ich ručne.

### Vymazanie vyrovnávacej pamäte

`tw::clearCache()` (alebo funkcia `clearCache()`) odstráni súbory `tailwind_*.css` z adresára vyrovnávacej pamäte a vráti počet odstránených súborov.

```php
use TailwindPHP\tw;
use function TailwindPHP\clearCache;

$deleted = tw::clearCache();                  // default directory
$deleted = tw::clearCache('/path/to/cache');  // custom directory
clearCache('/path/to/cache');                 // function form
```

## Vyrovnávacia pamäť stavu kompilátora

Vyrovnávacia pamäť výstupu pomáha iba vtedy, keď sa vráti rovnaký obsah. Ak sa obsah mení pri každom volaní, náročnou časťou je zostavenie samotného kompilátora: vyriešenie `@import "tailwindcss"`, analýza pribalených zdrojov a zhromaždenie témy. Táto fáza závisí iba od vstupného CSS, takže ju možno uložiť a znova použiť.

Odovzdajte `stateCacheFile` funkcii `tw::compile()` (alebo `new TailwindCompiler($css, $options)`):

```php
use TailwindPHP\tw;

$compiler = tw::compile($themeCss, [
    'stateCacheFile' => __DIR__ . '/cache/tailwind-state.php',
]);

$css = $compiler->generateExact($html, true);
```

Pri prvom vytvorení sa stav zapíše do danej cesty ako obyčajný súbor PHP, ktorý môže OPcache zdieľať medzi požiadavkami; pri ďalších vytvoreniach sa načíta namiesto opätovnej analýzy. Výstup je bajtovo totožný s výstupom kompilátora bez vyrovnávacej pamäte.

- Súbor sa overuje podľa odtlačku prostredia (veľkosť a čas poslednej úpravy zdrojov a zdrojových súborov TailwindPHP), kľúča odvodeného od vstupného CSS a možností `base` a `importSearchPaths`, ako aj veľkosti a času poslednej úpravy každého súboru importovaného vstupom. Pri nesúlade sa znova zostaví a prepíše, takže aktualizácia TailwindPHP alebo úprava importovaného súboru nevyžaduje ručný zásah.
- Cestu spravujete vy: pre každý odlišný vstup CSS použite samostatný súbor v adresári, do ktorého môže webový server zapisovať. Zápisy sú atomické (dočasný súbor a `rename()`).
- Vstupy používajúce vlastný `importResolver` obchádzajú vyrovnávaciu pamäť, pretože správanie prekladača nemožno zahrnúť do odtlačku.
- Rovnakú vyrovnávaciu pamäť možno použiť aj okolo nízkoúrovňového poľa `compile()` API ako `TailwindPHP\StateCache\compileCssCached($css, $cacheFile, $options)`.

`tw::generate()` neprijíma `stateCacheFile`; pri každom volaní zostaví nový kompilátor. Ak záleží na čase zostavenia, použite inštanciu kompilátora.

## Minifikácia

Minifikácia zmenšuje výstup pre produkčné prostredie. Príznak `minify` vytvára minifikované CSS priamo počas serializácie, takže ide o najrýchlejšiu aj najpresnejšiu cestu; `tw::minify()` spúšťa minifikátor pracujúci s reťazcom (`src/_tailwindphp/CssMinifier.php`) nad existujúcim reťazcom CSS:

```php
use TailwindPHP\tw;

// Minify during generation (serializer path, preferred)
$css = tw::generate([
    'content' => '<div class="flex p-4">Hello</div>',
    'minify' => true,
]);

// Or minify an existing string (string-based post-pass)
$css = tw::generate('<div class="flex p-4">Hello</div>');
$minified = tw::minify($css);
```

Obe cesty vytvárajú rovnocennú štruktúru, nie však totožné bajty. Cesta serializátora zachováva selektory potomkov `:not()`, ktoré priechod nad reťazcom zlučuje, preto pri generovanom výstupe uprednostnite príznak `minify` a `tw::minify()` používajte pre CSS, ktoré prichádza ako reťazec.

### Čo robí

Obe cesty vykonávajú rovnakú sadu zmenšení veľkosti:

| Krok | Účinok |
|------|--------|
| Odstránenie komentárov | Odstraňuje bloky `/* … */` |
| Zjednotenie medzier | Zlučuje opakované medzery a odstraňuje ich okolo `{ } ; : ,` a kombinátorov selektorov |
| Skrátenie hexadecimálnych farieb | `#ffffff` → `#fff`, `#aabbcc` → `#abc` |
| Odstránenie jednotiek pri nule | `0px` → `0` (časové hodnoty `0s`/`0ms` zostávajú zachované) |
| Skrátenie hrúbky písma | `font-weight:normal` → `400`, `font-weight:bold` → `700` |
| Odstránenie prázdnych pravidiel | Odstraňuje selektory s prázdnymi blokmi deklarácií |

Zámerne sa **nezlučujú** duplicitné selektory ani vlastnosti v skrátenom zápise — oboje sťažuje ladenie a môže ovplyvniť kaskádu.

### CLI: `--minify` vs. `--optimize`

[CLI](https://tailwindphp.inline0.dev/sk/docs/cli) sprístupňuje cestu minifikácie serializátora pomocou dvoch príznakov:

```bash
# Optimize and minify (smallest output)
tailwindphp -i ./src/app.css -o ./dist/styles.css --minify   # or -m

# Meant to optimize without minifying
tailwindphp -i ./src/app.css -o ./dist/styles.css --optimize
```

V aktuálnom vydaní minifikuje aj `--optimize`, takže oba príkazy zapisujú rovnaké bajty ([#9](https://github.com/inline0/tailwindphp/issues/9)). Transformácie ekvivalentné s lightningcss sa pri každom zostavení vykonajú tak či tak, takže obyčajný výstup (bez príznaku) je už optimalizovaný a čitateľný.

Zvyšok verejného API — `tw::generate()`, `tw::compile()`, metódy kontroly a vstupné formáty — nájdete v referenčnej príručke [API](https://tailwindphp.inline0.dev/sk/docs/api).
