Performanță și testare
TailwindPHP optimizează în primul rând pentru corectitudine. Când o modificare specifică PHP accelerează execuția fără să schimbe rezultatul, aceasta este aplicată și marcată @port-deviation:performance. Paritatea cu TailwindCSS nu este presupusă — este verificată continuu cu suita de teste proprie a lui Tailwind.
Performanță
Portarea PHP prioritizează potrivirea rezultatului TailwindCSS în locul debitului brut, iar originalul TypeScript rămâne oricum mai rapid — compilatorul JIT al lui V8 compilează căile intens utilizate în cod nativ într-un mod pe care PHP nu îl poate egala. Pentru CSS generat la fiecare cerere sau pagină, reutilizați un singur compilator (consultați generateExact()) și persistați starea de inițializare cu stateCacheFile.
Câteva căi intens utilizate au optimizări ajustate manual care păstrează rezultatul identic:
ast.phptoCss()— adună fragmente într-un tablou și leimplodeo singură dată, în loc să concateneze repetat șiruri, și folosește șiruri de indentare precomputate.css-parser.php— compară caracterele direct, fără să treacă prinord(), și urmărește lungimea bufferelor în loc să recalculezestrlen().
Ambele sunt documentate cu @port-deviation:performance și condiționate de suita de teste — nu pot modifica CSS generat.
Teste de performanță
Directorul benchmarks/ conține un instrument de comparare. Rulați-l astfel:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Rezultate de probă pe PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Test de performanță | PHP | TypeScript |
|---|---|---|
css-parser pe preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× mai rapid) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× mai rapid) |
TypeScript este mai rapid pentru aceste operații de nivel scăzut, așa cum era de așteptat. Pentru generarea CSS a unei pagini întregi — cazul de utilizare real — performanța PHP este adecvată (aproximativ 14 ms per pagină în rularea de probă). Pentru intrări identice repetate, cache-ul de fișiere elimină complet acest cost.
Testare și paritate
Testele garantează că portarea PHP produce același rezultat ca TailwindCSS. Două abordări funcționează împreună.
1. Teste bazate pe extragere. Scripturile din test-coverage/ analizează fișierele .test.ts proprii ale lui TailwindCSS și extrag cazurile de test în JSON. Apoi, PHPUnit rulează cazurile prin TailwindPHP și compară rezultatul cu valoarea CSS așteptată. Deoarece așteptările provin direct din amonte, orice abatere de la comportamentul PHP devine vizibilă printr-un eșec. Aceste teste acoperă componentele complexe: utilitare, variante, integrare, funcții CSS și testele ui.spec la nivel de browser.
2. Teste unitare portate manual. Fișierele de testare TypeScript mai simple (AST, analiză sintactică CSS, escape, analiza candidaților, analiza valorilor, …) sunt portate direct în PHP și se află lângă sursa lor ca *.test.php, oglindind structura și aserțiunile originalelor.
Bucla este extrage → rulează → verifică: extrageți din nou din referința TailwindCSS actuală, rulați suita, iar orice abatere provoacă un eșec. Astfel, portarea rămâne sincronizată cu sursa din amonte, iar o actualizare TailwindCSS poate fi validată automat, în loc să fie verificată prin inspecție. Abaterile provoacă eșecul CI.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
La versiunea 1.7.0 sunt 4,427 teste trecute (referința TailwindCSS v4.3.3):
| Suită | Teste | Sursă |
|---|---|---|
Suite TailwindCSS extrase (utilitare 706, variante 164, index 148, css-functions 64, ui.spec 68) |
1,150 | extrase din .test.ts / .spec.ts |
Acoperirea API (utilitare, modificatori, variante, directive, pluginuri, importuri, @source, cache, API public) |
2,252 | tests/ |
| Teste unitare lângă sursă (parser, AST, candidați, temă, utils, parser de selectori, transformări lightningcss, minificator) | 767 | portări *.test.php și teste specifice PHP |
| CLI (analiza argumentelor, rezultate, compilări) | 84 | tests/Cli*Test.php |
| Portări de pluginuri (typography, forms) | 45 | *.test.php lângă pluginuri |
| Biblioteci auxiliare (clsx, tailwind-merge, CVA) | 129 | suite de referință |
Calitatea codului
Formatarea și analiza statică rulează prin scripturile Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan rulează la nivelul 4 (phpstan.neon), cu o listă scurtă de tipare ignorate pentru formele dinamice de tablou folosite de arhitectura bazată pe funcții. Sunt analizate toate fișierele sursă; fișierele de test sunt excluse.
Pentru structura verificată de aceste teste și locurile unde sunt consemnate abaterile, consultați Arhitectură.