
# Kešatmiņa un minificēšana

Trīs ar produkcijas vidi saistīti uzdevumi atrodas konveijera beigās: izvairīties no vienādas ievades atkārtotas kompilēšanas, izvairīties no kompilatora izveides izmaksām katrā pieprasījumā un samazināt ģenerēto CSS apjomu. Visas trīs ir PHP puses palīgfunkcijas ap kompilatoru.

## Kešatmiņa

CSS ģenerēšana katrā izsaukumā izpilda visu konveijeru. Ja saturs starp pieprasījumiem nemainās, uz failiem balstītā kešatmiņa saglabā rezultātu diskā un turpmākajos izsaukumos to atgriež no turienes.

Padodiet `cache` funkcijai `tw::generate()` — `true` noklusējuma direktorijam vai ceļa virkni pielāgotam direktorijam:

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

Ja kešatmiņas direktorijs neeksistē, tas tiek izveidots automātiski.

### Kešatmiņas atslēga

Atslēgu veido **saturs**, **CSS konfigurācija** un **minify** karodziņš — tos ietver faila nosaukumā `tailwind_<hash>.css`. Jebkuras izmaiņas marķējumā, CSS ievadē vai minificēšanas ieslēgšanā rada citu atslēgu un līdz ar to citu failu.

Atslēgā ietvertā CSS konfigurācija ir iekļautais `css` un to failu saturs, kuri norādīti `importPaths`. Tajā nav iekļautas divas ievades: faili, kas tiek iekļauti ar ligzdotu `@import` šajos failos, un TailwindPHP versija. Pēc ligzdota importa rediģēšanas vai pakotnes jaunināšanas iztīriet kešatmiņu, citādi tiks turpināta vecās izvades atgriešana.

### Derīguma termiņš

`cacheTtl` ir derīguma termiņš sekundēs. Ja kešatmiņa tiek izmantota, faila modificēšanas laiks tiek salīdzināts ar pašreizējo laiku; ja fails ir vecāks par `cacheTtl`, tas tiek uzskatīts par kešatmiņas trāpījumu un kompilēts no jauna. Ja `cacheTtl` nav norādīts, ierakstiem nav derīguma termiņa — iztīriet tos manuāli.

### Kešatmiņas iztīrīšana

`tw::clearCache()` (vai funkcija `clearCache()`) noņem `tailwind_*.css` failus no kešatmiņas direktorija un atgriež dzēsto failu skaitu.

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

## Kompilatora stāvokļa kešatmiņa

Izvades kešatmiņa palīdz tikai tad, ja atgriežas tas pats saturs. Ja saturs mainās katrā izsaukumā, laikietilpīgākā daļa ir paša kompilatora izveide: `@import "tailwindcss"` atrisināšana, komplektēto resursu parsēšana un tēmas apkopošana. Šis posms ir atkarīgs tikai no ievades CSS, tāpēc to var saglabāt un izmantot atkārtoti.

Padodiet `stateCacheFile` funkcijai `tw::compile()` (vai `new TailwindCompiler($css, $options)`):

```php
use TailwindPHP\tw;

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

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

Pirmās izveides laikā stāvoklis tiek saglabāts šajā ceļā kā vienkāršs PHP fails, ko OPcache var koplietot starp pieprasījumiem; turpmākās izveides reizes to ielādē, nevis parsē atkārtoti. Izvade ir baitu līmenī identiska kešatmiņu neizmantojoša kompilatora izvadei.

- Fails tiek validēts, izmantojot dziņa kontrolsummu (TailwindPHP avotu un resursu izmēru un modificēšanas laiku), atslēgu, kas iegūta no ievades CSS, `base` un `importSearchPaths` opcijām, kā arī katra ievadē importētā faila izmēru un modificēšanas laiku. Ja rādītāji nesakrīt, tas tiek atjaunots un pārrakstīts, tāpēc TailwindPHP jaunināšanai vai importēta faila rediģēšanai nav vajadzīgas manuālas darbības.
- Ceļš jānorāda jums: izmantojiet atsevišķu failu katrai atšķirīgai ievades CSS, direktorijā, kurā tīmekļa serveris var rakstīt. Ieraksti ir atomāri (pagaidu fails un `rename()`).
- Ievades, kurās izmantots pielāgots `importResolver`, apiet kešatmiņu, jo risinātāja darbību nevar kontrolēt ar kontrolsummu.
- To pašu kešatmiņu var izmantot arī ap zemāka līmeņa `compile()` masīvu API kā `TailwindPHP\StateCache\compileCssCached($css, $cacheFile, $options)`.

`tw::generate()` nepieņem `stateCacheFile`; tas katrā izsaukumā izveido jaunu kompilatoru. Ja izveides izmaksas ir svarīgas, izmantojiet kompilatora instanci.

## Minimizēšana

Minificēšana samazina izvadi produkcijas videi. Karodziņš `minify` serializēšanas laikā tieši izvada minificētu CSS, tāpēc tas ir gan ātrākais, gan precīzākais risinājums; `tw::minify()` esošai CSS virknei piemēro virkņu minificētāju (`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);
```

Abi paņēmieni rada līdzvērtīgu struktūru, bet ne identiskus baitus. Serializētāja ceļš saglabā pakārtotos `:not()` atlasītājus, ko virknes apstrādes posms saplacina, tāpēc ģenerētai izvadei dodiet priekšroku karodziņam `minify`, bet CSS, kas saņemts kā virkne, minificējiet ar `tw::minify()`.

### Darbība

Abi paņēmieni veic vienu un to pašu izmēra samazināšanas soļu kopu:

| Solis | Rezultāts |
|------|--------|
| Noņem komentārus | Izmet `/* … */` blokus |
| Saplacina atstarpes | Apvieno atstarpju virknes un noņem tās ap `{ } ; : ,` un atlasītāju kombinatoriem |
| Saīsina heksadecimālās krāsas | `#ffffff` → `#fff`, `#aabbcc` → `#abc` |
| Noņem nulles mērvienības | `0px` → `0` (saglabā `0s`/`0ms` laika vērtības) |
| Saīsina fonta svaru | `font-weight:normal` → `400`, `font-weight:bold` → `700` |
| Noņem tukšos noteikumus | Atmet atlasītājus ar tukšiem deklarāciju blokiem |

Pēc ieceres netiek apvienoti dublēti atlasītāji vai saīsināti rekvizīti — abi apgrūtina atkļūdošanu un var ietekmēt kaskādi.

### CLI: `--minify` pret `--optimize`

[CLI](https://tailwindphp.inline0.dev/lv/docs/cli) ar diviem karodziņiem nodrošina piekļuvi serializētāja minificēšanas ceļam:

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

Pašreizējā laidienā `--optimize` arī veic minificēšanu, tāpēc abas komandas ieraksta vienādus baitus ([#9](https://github.com/inline0/tailwindphp/issues/9)). lightningcss ekvivalentās transformācijas tiek izpildītas katrā būvēšanas reizē, tāpēc parastā izvade (bez karodziņa) jau ir optimizēta un lasāma.

Pārējo publisko API — `tw::generate()`, `tw::compile()`, pārbaudes metodes un ievades formātus — skatiet [API atsaucē](https://tailwindphp.inline0.dev/lv/docs/api).
