Preskočiť na obsah

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.php toCss() — zhromažďuje fragmenty v poli a zavolá implode iba 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žitia ord() a sleduje dĺžky vyrovnávacej pamäte namiesto opakovaného výpočtu strlen().

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:

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

Shell
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:

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