Výkon a testovanie
TailwindPHP uprednostňuje správnosť. Zmeny špecifické pre PHP, ktoré zrýchľujú spracovanie bez zmeny výstupu, sa uplatňujú a označujú ako @port-deviation:performance. Zhoda s TailwindCSS sa nepredpokladá — priebežne sa overuje pomocou vlastnej testovacej sady Tailwind.
Výkon
Port PHP uprednostňuje zhodu výstupu s TailwindCSS pred maximálnou priepustnosťou a pôvodný TypeScript zostáva aj tak rýchlejší — JIT v V8 kompiluje často používané časti do natívneho kódu spôsobom, ktorý PHP nedokáže napodobniť. Pri generovaní CSS pre každú požiadavku alebo stránku opakovane používajte jeden kompilátor (pozrite generateExact()) a uchovávajte jeho stav po zostavení pomocou stateCacheFile.
Niekoľko často používaných častí obsahuje ručne vyladené optimalizácie, ktoré zachovávajú totožný výstup:
ast.phptoCss()— zhromažďuje fragmenty v poli a zavoláimplodeiba raz namiesto opakovaného spájania reťazcov; používa tiež vopred vypočítané reťazce odsadenia.css-parser.php— porovnáva znaky priamo namiesto použitiaord()a sleduje dĺžky vyrovnávacej pamäte namiesto opakovaného výpočtustrlen().
Obe optimalizácie sú zdokumentované pomocou @port-deviation:performance a ich použitie je podmienené úspešným prejdením testovacej sady — nemôžu zmeniť vygenerované CSS.
Porovnávacie testy
Adresár benchmarks/ obsahuje testovací nástroj na porovnanie. Spustíte ho takto:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Ukážkové výsledky na PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Porovnávací test | PHP | TypeScript |
|---|---|---|
css-parser na preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× rýchlejšie) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× rýchlejšie) |
TypeScript je pri týchto nízkoúrovňových operáciách podľa očakávania rýchlejší. Pri generovaní CSS celej stránky — čo je skutočný prípad použitia — je výkon PHP dostatočný (v ukážkovom behu približne 14 ms na stránku). Pri opakovanom rovnakom vstupe odstráni náklady úplne súborová vyrovnávacia pamäť.
Testovanie a zhoda
Testy zaručujú, že port PHP vytvára rovnaký výstup ako TailwindCSS. Spoločne sa používajú dva prístupy.
1. Testy založené na extrakcii. Skripty v test-coverage/ analyzujú vlastné súbory TailwindCSS .test.ts a extrahujú testovacie prípady do JSON. PHPUnit potom spustí tieto prípady cez TailwindPHP a porovná výstup s očakávaným CSS. Keďže očakávané výsledky pochádzajú priamo z upstreamu, každá odchýlka v správaní PHP sa prejaví ako zlyhanie. Tieto testy pokrývajú zložité oblasti: utility, varianty, integráciu, funkcie CSS a testy na úrovni prehliadača ui.spec.
2. Ručne prenesené jednotkové testy. Jednoduchšie testovacie súbory TypeScript (AST, analýza CSS, escapovanie, analýza kandidátov, analýza hodnôt, …) sa prenášajú priamo do PHP a ako *.test.php sa nachádzajú vedľa zdrojového kódu. Kopírujú štruktúru aj tvrdenia pôvodných testov.
Cyklus vyzerá takto: extrahovať → spustiť → overiť. Znovu extrahujte testy z aktuálnej referencie TailwindCSS, spustite testovaciu sadu a každá odchýlka spôsobí zlyhanie. Vďaka tomu zostáva prenesená verzia v súlade s upstreamom a aktualizáciu TailwindCSS možno overiť automaticky, nie ručnou kontrolou. Odchýlka spôsobí zlyhanie CI.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
K vydaniu 1.7.0 (referencia TailwindCSS v4.3.3) prechádza 4,427 testov:
| Sada | Testy | Zdroj |
|---|---|---|
Extrahované sady TailwindCSS (utility 706, varianty 164, index 148, css-functions 64, ui.spec 68) |
1,150 | extrahované z .test.ts / .spec.ts |
Pokrytie API (utility, modifikátory, varianty, direktívy, pluginy, importy, @source, cachovanie, verejné API) |
2,252 | tests/ |
| Jednotkové testy vedľa zdrojového kódu (parser, AST, kandidáty, téma, utility, parser selektorov, transformácie lightningcss, minifikátor) | 767 | porty *.test.php a testy špecifické pre PHP |
| CLI (analýza argumentov, výstup, zostavenia) | 84 | tests/Cli*Test.php |
| Porty pluginov (typografia, formuláre) | 45 | *.test.php vedľa pluginov |
| Sprievodné knižnice (clsx, tailwind-merge, CVA) | 129 | referenčné sady |
Kvalita kódu
Formátovanie a statická analýza sa spúšťajú pomocou skriptov Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan sa spúšťa na úrovni 4 (phpstan.neon) so stručným zoznamom ignorovaných vzorov pre dynamické tvary polí, ktoré používa architektúra založená na funkciách. Analyzujú sa všetky zdrojové súbory; testovacie súbory sú vylúčené.
Štruktúru, ktorú tieto testy overujú, a zaznamenané odchýlky nájdete v časti Architektúra.