
# Vahemälu ja minimeerimine

Töötlusahela lõpus tuleb arvestada kolme tootmiskeskkonna vajadusega: vältida identse sisendi uuesti kompileerimist, vältida kompilaatori loomise kulu iga päringuga ning vähendada genereeritud CSS mahtu. Kõik kolm on kompilaatori ümber toimivad PHP-poolsed abifunktsioonid.

## Vahemällu salvestamine

CSS loomisel käivitatakse iga kord kogu töötlusahel. Kui sisu päringute vahel ei muutu, kirjutab failipõhine vahemälu tulemuse kettale ja tagastab selle järgmistel kordadel sealt.

Edastage `cache` funktsioonile `tw::generate()` — `true` vaikekataloogi jaoks või kohandatud kataloogi asukohateena:

```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
]);
```

Vahemälukataloog luuakse automaatselt, kui seda veel pole.

### Vahemälu võti

Võti tuletatakse **sisust**, **CSS konfiguratsioonist** ja lipust **minify** — see räsitakse failinimeks `tailwind_<hash>.css`. Iga muudatus märgistuses, sisendis CSS või minimeerimise lubatuses annab erineva võtme ja seega ka erineva faili.

Võtmes olev **CSS konfiguratsioon** koosneb tekstisisesest `css`-st ja failide sisust, mille nimed on määratud parameetris `importPaths`. Võti ei arvesta kahte sisendit: faile, mis kaasatakse nende failide sees oleva pesastatud `@import` kaudu, ega TailwindPHP versiooni. Tühjendage vahemälu pärast pesastatud impordi muutmist või paketi uuendamist, vastasel juhul serveeritakse endiselt vana väljundit.

### Kehtivusaeg

`cacheTtl` on kehtivusaeg sekundites. Vahemälutabamuse korral võrreldakse faili muutmisaega praeguse ajaga; kui fail on vanem kui `cacheTtl`, käsitletakse seda vahemälupuudumisena ja kompileeritakse uuesti. Kui `cacheTtl` puudub, ei aegu kirjed kunagi — tühjendage need käsitsi.

### Vahemälu tühjendamine

`tw::clearCache()` (või funktsioon `clearCache()`) eemaldab vahemälukataloogist failid `tailwind_*.css` ja tagastab kustutatud failide arvu.

```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
```

## Kompilaatori oleku vahemälu

Väljundivahemälust on abi ainult siis, kui sama sisu esitatakse uuesti. Kui sisu muutub iga väljakutsega, on kulukas osa kompilaatori enda loomine: `@import "tailwindcss"` lahendamine, komplektis olevate ressursside parsimine ja teema koondamine. See etapp sõltub ainult sisendist CSS, seega saab selle salvestada ja uuesti kasutada.

Edastage `stateCacheFile` funktsioonile `tw::compile()` (või `new TailwindCompiler($css, $options)`):

```php
use TailwindPHP\tw;

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

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

Esimesel loomisel kirjutatakse olek antud teele lihttekstina PHP faili, mida OPcache saab päringute vahel jagada; hilisemal loomisel laaditakse see uuesti parsimise asemel failist. Väljund on bait-baidilt identne vahemäluta kompilaatori omaga.

- Faili kontrollitakse mootorisõrmejälje järgi (TailwindPHP lähtekoodifailide ja ressursside suurused ning muutmisajad), sisendist CSS ning suvanditest `base` ja `importSearchPaths` tuletatud võtme järgi ning iga sisendi imporditud faili suuruse ja muutmisaja järgi. Erinevuse korral koostatakse fail uuesti ja kirjutatakse üle; seega ei vaja TailwindPHP uuendamine ega imporditud faili muutmine käsitsi sekkumist.
- Teie vastutate tee eest: kasutage iga erineva sisendi CSS jaoks eraldi faili kataloogis, kuhu veebiserver saab kirjutada. Kirjutamine on atomaarne (ajutine fail ja `rename()`).
- Kohandatud `importResolver` kasutavad sisendid jätavad vahemälu vahele, sest lahendaja käitumist ei saa sõrmejäljega tuvastada.
- Sama vahemälu saab kasutada ka madalama taseme massiivi `compile()` API ümber, kasutades funktsiooni `TailwindPHP\StateCache\compileCssCached($css, $cacheFile, $options)`.

`tw::generate()` ei võta vastu parameetrit `stateCacheFile`; see loob iga väljakutsega uue kompilaatori. Kui loomise kulu on oluline, kasutage kompilaatori eksemplari.

## Minimeerimine

Minimeerimine vähendab väljundi mahtu tootmiskeskkonna jaoks. Lipp `minify` väljastab minimeeritud CSS juba serialiseerimise käigus, mistõttu on see kiireim ja täpseim viis; `tw::minify()` käivitab olemasoleva CSS stringi põhise minimeerija (`src/_tailwindphp/CssMinifier.php`):

```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);
```

Need kaks viisi annavad samaväärse struktuuri, kuid baidid pole identsed. Serialiseerija säilitab alamelementide `:not()` selektorid, mille stringitöötlus kokku liidab; seetõttu eelistage genereeritud väljundi jaoks lippu `minify` ja kasutage `tw::minify()` juhul, kui CSS saabub stringina.

### Mida see teeb

Mõlemad viisid rakendavad samu suuruse vähendamise võtteid:

| Etapp | Mõju |
|------|--------|
| Kommentaaride eemaldamine | Eemaldab `/* … */` plokid |
| Tühikute kokkusurumine | Koondab järjestikused tühikud ja eemaldab tühikud ümber `{ } ; : ,` ning selektorite kombinaatorite |
| Värvikoodide lühendamine | `#ffffff` → `#fff`, `#aabbcc` → `#abc` |
| Nullühikute eemaldamine | `0px` → `0` (säilitab väärtused `0s`/`0ms`) |
| Fondikaalu lühendamine | `font-weight:normal` → `400`, `font-weight:bold` → `700` |
| Tühjade reeglite eemaldamine | Eemaldab tühjade deklaratsiooniplokkidega selektorid |

Kavakohaselt ei ühendata korduvaid selektoreid ega lühivormis omadusi — mõlemad muudaksid silumise keerulisemaks ja võivad mõjutada kaskaadi.

### CLI: `--minify` või `--optimize`

[CLI](https://tailwindphp.inline0.dev/et/docs/cli) pakub serialiseerija minimeerimisteed kahe lipu kaudu:

```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
```

Praeguses versioonis minimeerib ka `--optimize`, seega kirjutavad mõlemad käsud samad baidid ([#9](https://github.com/inline0/tailwindphp/issues/9)). Lightningcss-iga samaväärsed teisendused käivitatakse igal ehitamisel, nii et tavaline väljund (ilma liputa) on juba optimeeritud ja loetaval kujul.

Ülejäänud avaliku API kohta — `tw::generate()`, `tw::compile()`, kontrollimeetodid ja sisendvormingud — vaadake [API viidet](https://tailwindphp.inline0.dev/et/docs/api).
